使用 [DisallowNull] 与不可为空的引用类型

Jas*_*ans 5 c# nullable-reference-types

我正在了解 C# 8.0 中可空引用类型的来龙去脉

在阅读有关可为空引用类型的博客时,我对以下示例感到有些困惑。

public static HandleMethods
{
    public static void DisposeAndClear([DisallowNull] ref MyHandle? handle)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

作者展示了如何[DisallowNull]在这种情况下使用属性。但是,我的疑问是您为什么需要这里的属性?这段代码不一样吗?

public static HandleMethods
{
    public static void DisposeAndClear(ref MyHandle handle)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

通过删除属性,并?在 末尾MyHandle,这会是一个类似的替代方案吗?

编辑:

感谢 UnholySheep,我相信我现在明白了。

public static void DisposeAndClear([DisallowNull] ref MyHandle? handle)
{
    handle = null;
}
Run Code Online (Sandbox Code Playgroud)

在调用这个版本的函数时,handle不能为null进去,但是在函数内部可以设置为null,所以当函数返回时,任何使用都handle需要检查是否handle为null。

Unh*_*eep 5

根据评论中的讨论
博客文章的重要部分如下

此 API 的典型用途是,我们有一个通过引用传递的非 null 实例,但当它被清除时,引用为 null

这意味着该方法接受非null对象,但在该方法中的某个点将handle被设置为null
As在采用不可空引用作为参数的版本中不允许设置 ( handle) ,必须使用其他版本nullref MyHandle handle