C# 是否同时分配并检查空值?

C# 是否同时分配并检查空值?,c#,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.Descen

我有以下情况:

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

}
你可以这么做

XElement children = xml.Descendants(ns + "Children").FirstOrDefault();
然后检查null

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

但您可以这样做:

null != children = xml.Descendants(ns + "Children").FirstOrDefault()
。因此,以下形式的语法可以:

SomeType someVariable;
if ((someVariable = valueToAssign) != null)
{
    // valueToAssign was not null
}
就你而言:

XElement children;

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

}

您可以在单个语句中分配并测试分配的值(但不能声明):

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

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

if (children != null)
{      
}
我倾向于后者,因为我认为它更具可读性(还允许您使用
var


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

我会这样做:

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

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

if(xml.subjects(ns+“Children”).FirstOrDefault()是XElement子项)
{
后代(ns+“子代”).FirstOrDefault();
}


这是一个迟来的回答,但是这个问题在谷歌的顶部出现了,而且它缺少一个C#7答案

啊,我不知道,所以我的语法是正确的,我只是猜测lol@Xaisoft你的语法不正确,你还在线声明它,这是无效的。我喜欢这种方法,一开始我没有注意到双括号。谢谢。如果没有找到子元素,这将抛出一个空异常。@Xaisoft:mhh,不应该是这种情况。如果您使用
First
,但是
FirstOrDefault
应该返回null,当FirstOrDefault说它返回默认值时,是您指定的默认值还是指定类型的默认值,例如,引用变量将为null?@Xaisoft:指定类型的默认值,在这种情况下为null。@Xaisoft很可能是
default(T)
,对于所有引用类型,它都是
null
。如果没有找到子项,则返回null,但这正是我想要避免的,不必先检查null,然后再赋值。@Xaisoft它在功能上与赋值,然后再检查变量是一样的,只是它在一行中完成。它做的工作并没有减少。很好。我快瞎了,一开始我没有注意到双括号,但这很好用。@Xaisoft是的,大括号定义了优先级,大括号代码的“结果”是一个
XElement
,可以测试为null。@ChrisSinclair我想说,基于“条件之前的赋值”,功能上是一样的,但你的流程很好地接受了它,也许这是你这么做的唯一真正原因。我也在while循环中这样做:
while((line=Console.ReadLine()).Length!=0)
,因为在while条件本身中表示的检查之前,您会得到一个“free”赋值,这是示例中的最终结果。这就是我所做的,但是如果没有找到子项,我会得到一个错误。@Xaisoft没有意义,因为如果是这样的话,你的代码也会抛出一个错误,不用担心!您可能还想检查null合并操作符:只是好奇,为什么是null!=首先?@xaisof没有太大的理由——只是我的口味——但是如果你用另一种方式来做,你必须把
children=xml.subjections(ns+“children”).FirstOrDefault()括在一个额外的括号中。否则,编译器会认为您试图将布尔值分配给
子对象
xml.subjects(ns+“children”).FirstOrDefault()!=null
)。如果您将
null!=一开始你就可以避免那种额外的妄想症——反正在我眼里看起来更干净:)
XElement children = xml.Descendants(ns + "Children").FirstOrDefault();
if(children != null)
{
    //use children
}