gpt4 book ai didi

C# 嵌套 null 检查 if 语句

转载 作者:太空宇宙 更新时间:2023-11-03 17:07:36 26 4
gpt4 key购买 nike

我有一个关于编程风格和 C# 语言设计的问题,我很想知道是否有更好的方法来完成我正在做的事情。

如果你有一个复杂的数据对象,其属性可以为空,但你想检查或操作数据是否存在,你不能像这样写一行

if(Myobject.MyNestedObject != null || Myobject.MyNestedObject.Property != null)
{
//code
}

因为编译器实际上会调用这两行代码来评估 if 语句。

相反,你必须(我相信)写:

if(Myobject.MyNestedObject != null)
{
if(Myobject.MyNestedObject.Property != null)
{
//code
}
}

还有比这更好的风格吗?我正在考虑如何使用 null coalesce (??) 但如果您尝试在同一语句中使用 MyNestedObject 的任何内容,它仍然会抛出。

更多信息:

    L_01b4: ldarg.1 
L_01b5: callvirt instance class [Myassembly]MyClass.MyObject [MyAssembly]MyClass::get_MyObject()
L_01ba: brtrue.s L_01cc
L_01bc: ldarg.1
L_01bd: callvirt instance class [MyAssembly]MyClass.MyObject [MyAssembly]MyClass::get_MyObject()
L_01c2: callvirt instance class [MyAssembly]MyClass.MyNestedObject [MyAssembly]MyClass.MyNestedObject::get_MyNestedObject()
L_01c7: ldnull
L_01c8: ceq
L_01ca: br.s L_01cd
L_01cc: ldc.i4.0
L_01cd: stloc.2
L_01ce: ldloc.2
L_01cf: brtrue L_0285
L_01d4: nop

据我了解,如果调用返回 true,而不是 null 或非 0(即,如果对象为 null,则不采用分支,然后控制流继续线性进行),这意味着在 L_01ba。这当然会执行 L_01c2,这将抛出空引用异常,因为 Myclass.MyObject 为空。

我是不是错过了什么。这是 .net 3.5 C# 编译器。

最佳答案

结合@Chris 和@aJ 的回答:

我认为您需要 && 运算符,而不是 ||。

if (Myobject.MyNestedObject != null &&
Myobject.MyNestedObject.Property != null)
{
//code
}

而 C# 的 && 运算符使用短路求值,因此如果第一个表达式返回 false,则不会对第二个表达式求值。

...

关于C# 嵌套 null 检查 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/766885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com