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

Using [DisallowNull] vs non-nullable reference type

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

在阅读 this blog 有关可空引用类型的内容时,我对以下示例感到有些困惑。

public static HandleMethods
{
    public static void DisposeAndClear([DisallowNull] ref MyHandle? handle)
    {
        ...
    }
}

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

public static HandleMethods
{
    public static void DisposeAndClear(ref MyHandle handle)
    {
        ...
    }
}

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

编辑:

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

public static void DisposeAndClear([DisallowNull] ref MyHandle? handle)
{
    handle = null;
}

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

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

Typical use for this API is that we have a non-null instance that we pass by reference, but when it is cleared, the reference is null

这意味着该方法接受一个非 null 对象,但在该方法的某个时刻 handle 将被设置为 null
由于在以 non-nullable 引用作为参数 (ref MyHandle handle) 的版本中不允许将 handle 设置为 null,因此必须使用其他版本