【发布时间】:2021-01-10 23:06:34
【问题描述】:
我正在阅读 C# 8 中称为可空引用类型的新功能的描述。该描述讨论了所谓的 null-forgiving 运算符。描述中的示例谈到了引用类型实例的取消引用(我认为是这样):
当您确定知道时,您也可以使用 null-forgiving 运算符 表达式不能为空,但编译器无法做到 认识到这一点。在以下示例中,如果
IsValid方法 返回 true,它的参数不为空,您可以安全地取消引用 它:public static void Main() { Person? p = Find("John"); if (IsValid(p)) { Console.WriteLine($"Found {p!.Name}"); } } public static bool IsValid(Person? person) { return person != null && !string.IsNullOrEmpty(person.Name); }如果没有 null-forgiving 运算符,编译器会生成
p.Name代码的以下警告:警告CS8602:取消引用 一个可能为空的引用。
我的印象是,在 C# 中取消引用一个对象意味着将其设置为 null。但看起来微软将访问对象的属性称为取消引用该对象。
问题是:当我们谈论引用类型实例时,C# 中的解引用术语是什么意思,而不是托管和非托管指针。
【问题讨论】:
-
问:c#取消引用一个对象意味着将其设置为null。答:不,绝对不是。 “取消引用对象”意味着“获取指针指向的变量”:docs.microsoft.com/en-us/dotnet/csharp/language-reference/…。是的,“取消引用”适用于“引用类型实例”。
-
@paulsm4 我想说这是一个很好的答案,你应该把它移到一个答案以获得代表:-)。
标签: c# dereference