C# 中引用类型后面的问号是什么意思?

Kub*_*a K 14 c#

参数类型后面的问号是引用类型的目的是什么?

OverflowException例如包含string?和参数的构造函数之一Exception?

public OverflowException(string? message, Exception? innerException);
Run Code Online (Sandbox Code Playgroud)

我认为将它们标记为可为空没有意义,因为它们不是值类型,因此默认情况下它们是可为空的。

重点是什么?这是否意味着不同的事情?

注意,值类型后面有一个问号的目的是什么(例如:int?myVariable)?描述值类型的行为 - 本质上是允许值类型为空值,但引用类型不需要这样做,因为它们已经可以包含空值。

Erm*_*ary 17

在 C# 8.0 中,引入了可为 null 的引用类型?- 这允许您通过附加到类型名称来将引用类型标记为可为 null。

空状态分析中,静态检查代码以跟踪引用的空状态。此分析可能会导致以下 2 种状态之一:

  • not-null - 变量具有非空值

  • Maybe-null - 变量可以为 null 或 not-null;分析仪无法确定

这很有用,因为它可以帮助编译器提供警告,帮助您编写不易被NullReferenceExceptions其他 API 使用且更容易被其他 API 使用的代码。

例如,编译器将发出以下警告。

#nullable enable
...

string message = null;

// Warning - CS8602 Dereference of a possibly null reference

Console.WriteLine(message.Length);
Run Code Online (Sandbox Code Playgroud)

这是因为由于message设置为 null,其状态被跟踪为Maybe-null。如果您尝试访问空对象的属性,这会发出警告以提醒您。是的,你是。

这是一个不同的例子:

#nullable enable
...

string message = "The quick brown fox jumps over the lazy dog";

// No warning
Console.WriteLine(message.Length);
Run Code Online (Sandbox Code Playgroud)

由于message已知不为 null,因此其状态设置为not-null。编译器不会产生警告,因为它知道您可以安全地取消引用该变量。它绝对不为空。

或者,您也可以决定告诉世界某些变量可以为空:)