我正在阅读C#8中名为可为null的引用类型的新特性的描述。该描述讨论了所谓的零容忍运算符。描述中的例子谈到了引用类型实例的去引用(我认为是这样(:
Microsoft文档
当您确定表达式不能为null,但编译器无法认识到这一点。在以下示例中,如果
IsValid
方法返回true,其参数不为null,可以安全地取消引用it: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宽容运算符,编译器将生成以下针对
p.Name
代码的警告:警告CS8602
:取消引用可能为空的引用。
我的印象是,在C#中,取消引用对象意味着将其设置为null。但看起来微软把访问对象的属性称为取消引用对象。
问题是:当我们谈论引用类型实例,而不是托管和非托管指针时,C#中的去引用术语是什么意思。
取消引用意味着跟随引用访问实际的底层对象。如果引用是null
,这将导致一个大问题。