假设我有一个方法,它以某种对象作为参数.现在假设如果向此方法传递一个空参数,则这是一个致命错误,应该抛出一个异常.我是否值得编写这样的代码(请记住,这只是一个微不足道的示例):

void someMethod(SomeClass x)
{
    if (x == null){
        throw new ArgumentNullException("someMethod received a null argument!");
    }

    x.doSomething();
}

或者,当它调用x.doSomething()时,仅仅依靠它是否安全?

其次,假设someMethod是一个构造函数,在调用另一个方法之前,不会使用x.我应该立即抛出异常,还是等到需要x时再抛出异常?

推荐答案

与不判断参数提供的NullReferenceException相比,我更喜欢ArgumentNullException.通常,我更喜欢在try 调用可能为空的对象上的方法之前始终判断空性.

如果方法是构造函数,那么它将取决于两个不同的因素:属性是否也有公共setter,以及实际使用对象的可能性有多大.如果存在公共setter,那么不通过构造函数提供有效实例是合理的,不应导致异常.

如果没有公共setter,并且可以在不引用注入对象的情况下使用包含对象,那么您可能希望推迟判断/异常,直到try 使用它.不过,我认为一般情况下,注入的对象对实例的运行至关重要,因此ArgumentNull异常是完全合理的,因为没有它实例就无法运行.

.net相关问答推荐

Powershell机器令牌组

如何使用AWS Lambda函数制作网络挂钩?

在 F# 中处理 Option - Some(null) 的好策略是什么

使用 PEM 文件创建 DSA 签名

使用 PostAsJsonAsync C# 时出现错误请求

无法加载文件或程序集 Microsoft.Extensions.DependencyInjection.Abstractions,版本 = 1.1.0.0

C# - 获取不包括隐藏文件的文件列表

IEnumerable Count() 和 Length 的区别

HashSet 是否保留插入顺序?

如何判断对象是否是某种类型的数组?

C# 编译为 32/64 位,或任何 cpu?

Await 运算符只能在 Async 方法中使用

创建多个线程并等待所有线程完成

如何比较 C# 中的(目录)路径?

在 .NET 中查找下一个 TCP 端口

在关闭警告中访问 foreach 变量

我应该绑定到 ICollectionView 还是 ObservableCollection

嵌套的 Try/Catch 块是个坏主意吗?

MemoryCache 不遵守配置中的内存限制

捕获控制台退出 C#