在C#中,是否应该检查传递给null的方法的引用?

Bil*_*eal 11 c# arguments argumentnullexception nullreferenceexception

好吧,几个月前我问了一个关于C和C++的类似问题,但由于整个"Windows Phone"的缘故,我最近一直在关注C#.

那么,在C#中,是否应该在方法边界检查NULL?我认为这与C和C++不同,因为在C#中,通常可以确定给定的引用是否有效 - 编译器将阻止在任何地方传递未初始化的引用,因此唯一剩下的可能错误是它为null .此外,在.NET Framework中为这些事物定义了一个特定的异常,即ArgumentNullException,它似乎编写了程序员认为在传递无效null时应该获得的异常.

我的个人意见再次表明,打电话的人打破了这个问题,而且打电话的人应该把NRE扔到他们面前,直到几天结束.但是,我对这方面的不太确定,而不是我在本地代码领域 - 在这方面,与C或C++相比,C#的编程风格完全不同.

那么......你应该在C#方法中检查空参数吗?

jas*_*son 8

是的,检查一下.最好使用代码约定来告诉调用者您需要非空参数

void Foo(Bar bar) {
    Contract.Requires(bar != null);
}
Run Code Online (Sandbox Code Playgroud)

这是特别有利的,因为客户端可以准确地看到参数需要什么.

如果您不能使用代码合同,请使用保护条款

void Foo(Bar bar) {
    Guard.Against<ArgumentNullException>(bar == null);
}
Run Code Online (Sandbox Code Playgroud)

失败快.

  • @Bala R:您可以进行静态检查,它将成为文档的一部分. (2认同)

Bol*_*ock 5

如果您的方法不希望特定参数为null,我认为抛出ArgumentNullException(或使用Jason建议的合约)更好.通过与客户的合同,在调用方法时首先不传递null是一个更好的指标.

空检查是那么客户的责任,这使得更易于维护的代码面(通常是一个双赢的局面)......至少这是我的感觉.