使用 [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
,因此必须使用其他版本
我正在了解 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
,因此必须使用其他版本