gpt4 book ai didi

c# - C#中的空参数检查

转载 作者:IT王子 更新时间:2023-10-29 03:40:53 25 4
gpt4 key购买 nike

在 C# 中,是否有任何充分的理由(除了更好的错误消息)向每个 null 不是有效值的函数添加参数 null 检查?显然,使用 s 的代码无论如何都会抛出异常。此类检查会使代码变慢且更难维护。

void f(SomeType s)
{
if (s == null)
{
throw new ArgumentNullException("s cannot be null.");
}

// Use s
}

最佳答案

是的,有充分的理由:

  • 它准确识别什么是 null,这在 NullReferenceException
  • 中可能并不明显
  • 即使某些其他条件意味着该值未取消引用,它也会使代码在无效输入时失败
  • 它使异常发生之前该方法可能会在第一次取消引用之前产生您可能达到的任何其他副作用
  • 这意味着您可以确信,如果您将参数传递给其他东西,您不会违反他们的契约(Contract)
  • 它记录了您的方法要求(当然,使用 Code Contracts 会更好)

现在谈谈你的反对意见:

  • 速度较慢:您是否发现这实际上是您代码中的瓶颈,或者您是在猜测?无效检查非常快,在绝大多数情况下,它们不会成为瓶颈
  • 它使代码更难维护:我认为恰恰相反。我认为在明确参数是否可以为 null 并且您确信该条件得到执行的地方使用代码会更容易

对于你的断言:

Obviously, the code that uses s will throw an exception anyway.

真的吗?考虑:

void f(SomeType s)
{
// Use s
Console.WriteLine("I've got a message of {0}", s);
}

它使用 s,但它不会抛出异常。如果 s 为 null 是无效的,并且表明出现了问题,则异常是此处最合适的行为。

现在,将这些参数验证检查放在哪里是另一回事了。您可能决定信任您自己类中的所有代码,因此不必担心私有(private)方法。您可能决定信任程序集的其余部分,因此不必为内部方法操心。您几乎肯定应该验证公共(public)方法的参数。

旁注:ArgumentNullException 的单参数构造函数重载应该只是参数名称,因此您的测试应该是:

if (s == null)
{
throw new ArgumentNullException("s");
}

或者,您可以创建一个扩展方法,允许更简洁:

s.ThrowIfNull("s");

在我的(通用)扩展方法版本中,如果它不是 null,我让它返回原始值,允许您编写如下内容:

this.name = name.ThrowIfNull("name");

如果您不太在意的话,您也可以有一个不带参数名称的重载。

更新 .NET 6

有一个new method在 .NET API 中简化了 null 检查语法。

 ArgumentNullException.ThrowIfNull(someParameter);

关于c# - C#中的空参数检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7585493/

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