假设我有一个方法,它接受某种类型的对象作为参数。现在假设这个方法被传递了一个null参数,这是一个致命的错误,并且应该抛出一个异常。对我来说,编写这样的代码是否值得(请记住,这只是一个微不足道的例子):
void someMethod(SomeClass x)
{
if (x == null){
throw new ArgumentNullException("someMethod received a null argument!");
}
x.doSomething();
}
或者当它调用x.doSomething()时,仅仅依靠它抛出NullException对我来说是安全的吗?
其次,假设someMethod是一个构造函数,在调用另一个方法之前不会使用x。我是应该立即抛出异常,还是等到需要x时再抛出异常?
发布于 2008-12-15 15:46:11
与不检查参数的NullReferenceException
相比,我更喜欢ArgumentNullException
。通常,我倾向于在尝试调用可能为空的对象上的方法之前,始终检查是否为空。
如果方法是一个构造函数,那么它将取决于两个不同的因素:属性是否也有一个公共setter,以及对象被实际使用的可能性有多大。如果有一个公共setter,那么不通过构造函数提供有效的实例将是合理的,并且不应该导致异常。
如果没有公共setter,并且可以在不引用注入对象的情况下使用包含对象,那么您可能希望将检查/异常推迟到尝试使用它。我认为一般情况下,注入的对象对于实例的运行是必不可少的,因此ArgumentNull异常是完全合理的,因为实例没有它就无法运行。
发布于 2008-12-15 18:28:15
我同意快速失败的想法--然而,明智的做法是知道为什么快速失败是可行的。考虑这个例子:
void someMethod(SomeClass x)
{
x.Property.doSomething();
}
如果你依靠NullReferenceException
来告诉你出了什么问题,你怎么知道什么是空的呢?堆栈跟踪将只给出一个行号,而不是哪个引用为空。在本例中,x
或x.Property
可能都为空,如果没有提前进行积极检查而快速失败,您将不知道它是哪一个。
发布于 2020-03-11 18:58:46
这几天没有理由不结账。C#已经前进了,您可以非常灵活地使用一个丢弃和一个空合并运算符来完成此操作:
_ = declaringType ?? throw new ArgumentNullException(nameof(declaringType));
_ = methodname ?? throw new ArgumentNullException(nameof(methodName));
https://stackoverflow.com/questions/368742
复制相似问题