可为空<T> 结构

Nullable<T> Structure

我阅读了 Nullable Structure 并理解了大部分内容。但是我不知道人们什么时候以及为什么会使用它。

Nullable<T> 的使用范围很广。例如,假设您有一个查询 returns 博客上特定用户的最后一个 post 的 ID:

int lastId = User.GetLastPostId();

如果用户还没有任何post,方法returns null 并导致异常。解决方案是使用 Nullable<int> 而不是 int 来避免错误。

int? lastId = User.GetLastPostId();

在这种情况下,您甚至可以检查是否为空:

if(lastId == null)
    // do something
else
    // do something

类似于上面的内容,假设您想在代码中使用 struct 而不是 class。至于结构体是ValueType,它不能接受空值,如果你想强制结构体接受空值,你应该将它定义为Nullable。

Struct Person
{
    public string Name;
}

Person p = null; // Error
Person? p = null; // Correct

C# 具有 reference 类型(classes)和 value 类型(结构和内置类型)的概念例如 intboolDateTime 等)。

引用类型可以有一个 null 值,表明它们还没有被赋值(或者它们有 "no" 值)。

值类型最初没有可空值的概念。它们在某些上下文中具有默认值(例如 class 中的 int 字段的默认值为 0)。但是他们没有"no"值的概念。

输入Nullable<T>.

Nullable<T>(或其 shorthand 符号 T?)表示可能有也可能没有值的值类型。

例如

int? foo = null; // No initial value
foo = 9; // Now it has a value
foo = null; // No value again

并且有查询该值是否存在并检索它的方法:

if (foo.HasValue)
{
    int actualValue = foo.Value;
}

这很有用的一个领域是编写连接数据库的代码。许多数据库中的数字(整数)列可以配置为可为空。如果 C# 本身没有可为 null 的类型,您将需要跳过各种步骤来处理代码中的 null DB 值(例如,使用特殊的标记值来表示 null DB 值)。可空类型使它以更无缝的方式运行。