C# 检查对象和它';带discard“的null的s属性_&引用;在一个表达式C中#
我喜欢在检查对象是否为null以及是否为null时使用丢弃抛出异常。 像这样:C# 检查对象和它';带discard“的null的s属性_&引用;在一个表达式C中#,c#,C#,我喜欢在检查对象是否为null以及是否为null时使用丢弃抛出异常。 像这样: using System; public class C { public class Mind { } public class Human { public Mind Mind { get; set; } } public void M(Human animal) { _ = a
using System;
public class C
{
public class Mind
{
}
public class Human
{
public Mind Mind { get; set; }
}
public void M(Human animal)
{
_ = animal ?? throw new Exception("");
_ = animal.Mind ?? throw new Exception("");
}
}
此代码的反编译版本(方法M)将是
在一个表达中同时检查“阿米纳尔”和“动物思维”,哪种方式是好的、漂亮的和最佳的?
我有两种变体
_ = ((object)animal ?? throw new Exception("")) ?? animal.Mind ?? throw new Exception("");
//Decompiled without { & }
if (animal == null)
throw new Exception("");
if (animal == null && animal.Mind == null)
throw new Exception("");
_ = ((object)animal ?? animal.Mind) switch { null => throw new Exception(""), _ => animal };
//Decompiled without { & }
object obj = ((object)animal) ?? ((object)animal.Mind);
if (obj == null)
throw new Exception("");
您可以使用以下命令将其设置为一行程序: 或不使用丢弃:
if (animal?.Mind == null) throw new Exception("");
丢弃和三元运算符存在不会突然使
if
过时。这是主观的,但与编写地球上每个人都能理解的代码相比,你所演示的东西没有一件是“好”的,你甚至不能要求一个行税--如果(animal==null)抛出新的ArgumentNullException(nameof(animal))代码>。VS甚至可以自动生成这个。而且,如果你觉得有必要放弃,那么显然你甚至没有使用这个论点,这只是提出了进一步的问题。标准模式类似于this.animal=animal??抛出新ArgumentNullException(…)
。如果您只需要animal
sMind
属性,为什么不直接传递Mind
并保存一张支票呢?
_ = animal?.Mind ?? throw new Exception("");
if (animal?.Mind == null) throw new Exception("");