如果对象为null则引发异常

l--*_*''' 5 .net c# null operators visual-studio

我最近发现:

if (Foo() != null)    
   { mymethod(); }
Run Code Online (Sandbox Code Playgroud)

可以改写成

Foo?.mymethod()
Run Code Online (Sandbox Code Playgroud)

可以用类似的方式重写以下内容吗?

if (Foo == null)
{ throw new Exception()}
Run Code Online (Sandbox Code Playgroud)

mis*_*rop 26

从 .NET 6 开始,您可以使用ArgumentNullException.ThrowIfNull()静态方法:

void HelloWorld(string argumentOne)
{
    ArgumentNullException.ThrowIfNull(argumentOne);
    Console.WriteLine($"Hello {argumentOne}");
}
Run Code Online (Sandbox Code Playgroud)

  • 此方法是随 .NET 6 Framework 而不是 C# Lang 10 引入的。 https://learn.microsoft.com/en-us/dotnet/api/system.argumentnullexception.throwifnull?view=net-6.0 例如,如果您的项目 ` netcoreapp3.1` 框架并使用 C# 10.0 您不能使用此静态方法。 (2认同)

Kau*_*ano 7

是的,从C#7开始,您可以使用Throw Expressions

var firstName = name ?? throw new ArgumentException (nameof(name), "Mandatory parameter");
Run Code Online (Sandbox Code Playgroud)

资源


Cha*_*thJ 6

C# 6 中没有类似的时尚语法。

但是,如果您愿意,可以使用扩展方法简化空检查...

 public static void ThrowIfNull(this object obj)
    {
       if (obj == null)
            throw new Exception();
    }
Run Code Online (Sandbox Code Playgroud)

用法

foo.ThrowIfNull();
Run Code Online (Sandbox Code Playgroud)

或者改进它以显示空对象名称。

 public static void ThrowIfNull(this object obj, string objName)
 {
    if (obj == null)
         throw new Exception(string.Format("{0} is null.", objName));
 }

foo.ThrowIfNull("foo");
Run Code Online (Sandbox Code Playgroud)

  • 方法调用可以改为: foo.ThrowIfNull(nameof(foo)); 如果更改变量名称,则更安全:) (5认同)

Tyl*_*uso 2

我不知道你为什么会..

public Exception GetException(object instance)
{
    return (instance == null) ? new ArgumentNullException() : new ArgumentException();
}

public void Main()
{
    object something = null;
    throw GetException(something);
}
Run Code Online (Sandbox Code Playgroud)