C# 检查对象和它';带discard“的null的s属性_&引用;在一个表达式C中#

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

我喜欢在检查对象是否为null以及是否为null时使用丢弃抛出异常。 像这样:

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
s
Mind
属性,为什么不直接传递
Mind
并保存一张支票呢?
_ = animal?.Mind ?? throw new Exception("");
if (animal?.Mind == null) throw new Exception("");