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
}