2012-06-15 5 views
2

У меня есть следующий сценарий:Присвоить и проверить нулевое значение одновременно?

if(xml.Descendants(ns + "Children").FirstOrDefault() != null) 
{ 
    XElement children = xml.Descendants(ns + "Children").FirstOrDefault(); 
} 

Есть ли способ, что я могу проверить нуль и присвоить значение, в то же время, вместо того, чтобы искать значения в два раза, что-то подобное:

//Not sure if this is correct. 
if (XElement children = xml.Descendants(ns + "Children").FirstOrDefault() != null) 
{ 

} 

ответ

7

A variable assignment also returns the value. Таким образом, синтаксис в виде следующего будет делать:

SomeType someVariable; 
if ((someVariable = valueToAssign) != null) 
{ 
    // valueToAssign was not null 
} 

В вашем случае:

XElement children; 

if ((children = xml.Descendants(ns + "Children").FirstOrDefault()) != null) 
{ 

} 
+0

А я понятия не имел, поэтому мой синтаксис был верным, я просто догадался lol – Xaisoft

+1

@ Xaisoft Ваш синтаксис неверен, вы также объявляете его в строке, что недопустимо. –

+0

@lol, ОК Я говорил в ближайшее время. Теперь я вижу разницу. – Xaisoft

2

Вы можете просто сделать

XElement children = xml.Descendants(ns + "Children").FirstOrDefault(); 

, а затем проверить на нуль

if (children != null) {...} 
+0

Если нет детей элементы найдены, это не бросает исключения нулевого. – Xaisoft

+0

@Xaisoft: mhh, этого не должно быть. Это будет случай, если вы используете 'First', но' FirstOrDefault' должен возвращать значение null –

+0

Когда FirstOrDefault говорит, что оно возвращает значение по умолчанию, это значение по умолчанию, которое вы указываете, или оно является значением по умолчанию для указанного типа, например ссылкой переменные будут иметь значение null? – Xaisoft

0

Вы можете сделать это, хотя:

null != children = xml.Descendants(ns + "Children").FirstOrDefault() 
+0

Просто любопытно, почему нуль! = Сначала? – Xaisoft

+0

@ Xaisoft нет никаких оснований - просто мой вкус - но если вы сделаете это наоборот, вам придется обернуть 'children = xml.Descendants (ns +« Children »). FirstOrDefault()' в дополнительном наборе скобка. В противном случае компилятор подумает, что вы пытаетесь назначить логическое значение 'children' (' xml.Descendants (ns + «Children»). FirstOrDefault()! = Null'). Если вы положили 'null! =' В начале, вы должны избегать этого дополнительного набора paranthesis - все равно выглядит чище для моих глаз :) –

1

Вы можете назначить, а затем проверить присвоенное значение в одном операторе (но не объявить его):

XElement children = null; 

if ((children = xml.Descendants(ns + "Children").FirstOrDefault()) != null) 
{  
} 

Но это функционально то же самое, как назначение и тестирование впоследствии:

var children = xml.Descendants(ns + "Children").FirstOrDefault(); 

if (children != null) 
{  
} 

Я бы предпочел последнее, потому что я думаю, что это более читаемо (также позволяет использовать var).

Назначение нулевого значения переменной никогда не будет генерировать ошибку (предполагая, что это только стандартная локальная переменная), возможно последующее использование этой переменной. Таким образом, решение, приведенное выше, будет безопасным, если xml сам по себе не является нулевым.

+0

Да, он возвращает null, если не найдено ни одного ребенка, но это то, что я хочу избежать, чтобы проверить значение null, а затем присвоить значение. – Xaisoft

+0

@ Xaisoft Это функционально то же самое, что и назначение его, а затем проверка переменной после этого - только она делает это в одной строке. Это не делает меньше работы. –

+0

Ницца. Я ослеп, я не замечаю двойную фигуру сначала, но это отлично работает. – Xaisoft

4

Я хотел бы сделать это следующим образом:

XElement children = xml.Descendants(ns + "Children").FirstOrDefault(); 
if(children != null) 
{ 
    //use children 
} 
+0

Это то, что я делал, но если бы детей не было найдено, я бы ошиблась. – Xaisoft

+0

@ Xaisoft не имеет смысла, потому что если это так, ваш код также выдаст ошибку –

+0

Верю, что вы правы, моя ошибка. – Xaisoft

Смежные вопросы