术语“取消引用”对象究竟是什么意思?

usr*_*020 7 c# dereference

我正在阅读 C# 8 中称为可为空引用类型的新功能的描述。该描述讨论了所谓的 null-forgiving 运算符。描述中的示例谈到了引用类型实例的取消引用(我认为是这样):

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-forgiving

当您明确知道表达式不能为 null 但编译器无法识别时,您也可以使用 null-forgiving 运算符。在以下示例中,如果 IsValid 方法返回 true,则其参数不为 null,您可以安全地取消引用它:

     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); 
     }
Run Code Online (Sandbox Code Playgroud)

如果没有空值原谅运算符,编译器会为 p.Name 代码生成以下警告:警告 CS8602:取消引用可能为空值的引用。

我的印象是,在 C# 中取消引用对象意味着将其设置为 null。但看起来 Microsoft 将访问对象的属性称为取消引用该对象。

问题是:当我们谈论引用类型实例而不是托管和非托管指针时,C# 中的解引用术语是什么意思。

Joe*_*orn 5

解除引用意味着跟随引用来访问实际的底层对象。如果引用是null,这会导致一个大问题。