引用类型空检查

Reference type null checking

提问人:Alex 提问时间:11/3/2022 更新时间:11/3/2022 访问量:162

问:

我是否应该检查传递给方法的每个引用类型参数是否不为空?

选项 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();
}
C# 异常 方法 null

评论

0赞 gunr2171 11/3/2022
您是否正在使用“可以为空的引用类型”功能?你相信吗?
1赞 gunr2171 11/3/2022
什么是,为什么不起作用?Contract.Requires
2赞 Pac0 11/3/2022
另一种选择:忽略任何 null,而不引发任何异常。a?.DoSomething(); b?.DoSomething();
0赞 Alex 11/3/2022
gunr2171 ,不,我不使用可为空的引用类型。但是,我们仍然可以为不可为 null 的引用类型分配一个 null 值(即使它会标有警告)。我应该检查不可为 null 的引用参数是否为 null 还是只信任警告?

答:

2赞 StriplingWarrior 11/3/2022 #1

如果您不希望该值为空,则肯定希望在该值为 null 时抛出参数异常。但这并不意味着你必须添加一堆额外的代码。

我个人喜欢启用可为 null 的引用类型,将可为 null 的警告转换为编译器错误,并在要添加此行为的任何类型/程序集/项目上启用 Fody NullGuard。NullGuard 会将代码添加到已编译的程序集,以便在非 null 参数或返回值为 null 时引发异常。

评论

1赞 Poul Bak 11/3/2022
我看作是我的朋友。它准确地告诉我我做错了什么。有些人可能会尝试使用类似的代码,然后他们没有例外,但值错误,这更难调试。NullReferenceExceptionstring bla = ""
1赞 StriplingWarrior 11/4/2022
@PoulBak:是的,例外是我们的朋友。s 通常是因为代码做出了错误的假设而被抛出。我喜欢把这些假设说清楚,并尽早测试它们。在这种情况下,“我做错了什么”不是 中的行 : 它是某人首先将 null 值传递到的行。我喜欢有一个包含null参数名称的参数。NullReferenceExceptiona.DoSomething()FooFooArgumentNullException