提问人:Alex 提问时间:11/3/2022 更新时间:11/3/2022 访问量:162
引用类型空检查
Reference type null checking
问:
我是否应该检查传递给方法的每个引用类型参数是否不为空?
选项 1,不检查:
public void Foo(A a, B b)
{
a.DoSomething();
b.DoSomething();
}
选项 2,选中:
public void Foo(A a, B b)
{
if (a is null)
throw new ArgumentNullException();
if (b is null)
throw new ArgumentNullException();
a.DoSomething();
b.DoSomething();
}
我也尝试过类似的东西,但它根本不起作用
public void Foo(A a, B b)
{
Contract.Requires(a is not null);
Contract.Requires(b is not null);
a.DoSomething();
b.DoSomething();
}
答:
2赞
StriplingWarrior
11/3/2022
#1
如果您不希望该值为空,则肯定希望在该值为 null 时抛出参数异常。但这并不意味着你必须添加一堆额外的代码。
我个人喜欢启用可为 null 的引用类型,将可为 null 的警告转换为编译器错误,并在要添加此行为的任何类型/程序集/项目上启用 Fody NullGuard。NullGuard 会将代码添加到已编译的程序集,以便在非 null 参数或返回值为 null 时引发异常。
评论
1赞
Poul Bak
11/3/2022
我看作是我的朋友。它准确地告诉我我做错了什么。有些人可能会尝试使用类似的代码,然后他们没有例外,但值错误,这更难调试。NullReferenceException
string bla = ""
1赞
StriplingWarrior
11/4/2022
@PoulBak:是的,例外是我们的朋友。s 通常是因为代码做出了错误的假设而被抛出。我喜欢把这些假设说清楚,并尽早测试它们。在这种情况下,“我做错了什么”不是 中的行 : 它是某人首先将 null 值传递到的行。我喜欢有一个包含null参数名称的参数。NullReferenceException
a.DoSomething()
Foo
Foo
ArgumentNullException
评论
Contract.Requires
a?.DoSomething(); b?.DoSomething();