参数类型后面的问号是引用类型的目的是什么?
例如,一个构造函数OverflowException
包含string?
and Exception?
参数:
public OverflowException(string? message, Exception? innerException);
我认为将它们标记为可为空没有意义,因为它们不是值类型,因此默认情况下它们是可为空的。
重点是什么?这意味着什么不同吗?
请注意,有值类型后面的问号的用途是什么(例如:int?myVariable)? https://stackoverflow.com/questions/2690866/what-is-the-purpose-of-a-question-mark-after-a-value-type-for-example-int-myv描述值类型的行为 - 本质上是允许值类型为空值,但引用类型不需要这样做,因为它们已经可以包含空值。
在 C# 8.0 中,可为空的引用类型 https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#nullable-reference-types被引入 - 这允许您通过附加将引用类型标记为可为空?
到类型名称。
In 零状态分析 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/attributes/nullable-analysis,静态检查代码以跟踪引用的空状态。此分析可能会导致以下 2 种状态之一:
-
not-null- 变量具有非空值
-
也许为空- 变量可以为空或非空;分析仪无法确定
这很有用,因为它可以帮助编译器提供警告来帮助您编写代码不易出现NullReferenceExceptions
and 更容易被其他 API 使用.
例如,编译器将发出以下警告。
#nullable enable
...
string message = null;
// Warning - CS8602 Dereference of a possibly null reference
Console.WriteLine(message.Length);
这是因为自从message
被设置为 null,其状态被跟踪为也许为空。如果您尝试访问空对象的属性,这会发出警告以提醒您。是的,你是。
这是一个不同的例子:
#nullable enable
...
string message = "The quick brown fox jumps over the lazy dog";
// No warning
Console.WriteLine(message.Length);
Since message
众所周知不为空,其状态设置为not-null。编译器不会产生警告,因为它知道您可以安全地取消引用该变量。这是确实不为空。
或者,您也可以决定告诉世界某些变量可以为空:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)