同时分配并检查空值?

时间:2012-06-15 13:53:43

标签: c#

我有以下情况:

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

有没有办法可以检查null并同时分配值,而不必两次搜索值,类似于:

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

}

6 个答案:

答案 0 :(得分:9)

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)
{

}

答案 1 :(得分:4)

我会这样做:

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

答案 2 :(得分:2)

你可以做到

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

然后检查null

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

答案 3 :(得分:1)

您可以在单个语句中分配然后测试指定的值(但不要声明它):

XElement children = null;

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

但这在功能上与之后的分配和测试相同:

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

if (children != null)
{      
}

我赞成后者,因为我认为它更具可读性(也允许你使用var)。

将空值赋值给变量本身永远不会产生错误(假设这只是一个标准的局部变量),后续使用该变量可能会产生错误。因此,假设xml本身不为空,则上述任一解决方案都是安全的。

答案 4 :(得分:0)

你可以这样做:

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

答案 5 :(得分:0)

您可以在C#7中使用模式匹配

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

这是一个较晚的答复,但是这个问题出现在Google的顶部,并且缺少C#7答案