可为 null 的引用类型和 null-oblivious 库

Nullable reference types and null-oblivious libraries

提问人:Astemir Almov 提问时间:12/9/2021 更新时间:12/9/2021 访问量:541

问:

最近,我们开始在项目中使用 C# 可为 null 的引用类型。 当然,在我们的项目中,我们使用不支持可为 null 的引用类型的 nuget 库。

使用此类库的最佳实践是什么? 我说的是这样的情况:

public class MyClass
{
    public string myString { get; }

    public MyClass(string myString)
    {
        this.myString = myString;
    }
}

可以使用外部 null-oblivious 库中的 null 值初始化属性。分析器不会以任何方式警告您。 代码将抛出 NullReferenceException。 这就是为什么在我看来,可为 null 的引用类型有点无用。 以前,我们使用守卫来验证构造函数中的属性,如下所示:

public MyClass(string myString)
{
    if (myString == null) throw new ArgumentNullException();
    this.myString = myString;
}

是否有其他防御技术和最佳做法来保护代码免受 NullReferenceException 的影响?

C# 防御性编程

评论

3赞 Marc Gravell 12/9/2021
你仍然可以使用 null-checkds,尤其是当你的代码可能暴露给“null-oblivious”调用方时。但即使在一般情况下:c#8 的 null 引用检查也是尽力而为,而不是绝对的。
2赞 Matthew Watson 12/9/2021
您仍必须包含 null 检查。这不是可选的。你甚至不需要一个 null-oblivious 库来调用 null - 有些代码可以做到,你不会收到任何警告。var x = new MyClass(null!);
2赞 Astemir Almov 12/9/2021
@MatthewWatson这是真的。感叹号让我很担心。我们已经有了这样的代码:class MyClass{ string myString { get; set;} = default! }

答: 暂无答案