可以为空的<t>结构

时间:2018-06-06 01:26:29

标签: c# structure nullable

我阅读Nullable Structure并了解其中的大部分内容。但我不知道人们何时以及为何会使用它。

2 个答案:

答案 0 :(得分:5)

C#具有引用类型(类)和类型的概念(结构和内置类型,例如intboolDateTime等。)。

引用类型可以有null值,表示它们尚未分配(或者它们具有&#34; no&#34;值)。

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

输入Nullable<T>

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

e.g。

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#本身没有可空类型,则需要跳过箍来处理代码中的空DB值(例如,使用特殊的sentinel值来表示空DB值)。可空类型使其以更加无缝的方式运行。

答案 1 :(得分:2)

Nullable<T>的用法很广泛。例如,假设您有一个查询,该查询返回博客上特定用户的最后一篇文章的ID:

int lastId = User.GetLastPostId();

如果用户尚未发布任何帖子,则该方法返回null并导致异常。解决方案是使用Nullable<int>而不是int来避免错误。

int? lastId = User.GetLastPostId();

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

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

如上所述,假设您想在代码中使用struct而不是class。只要struct是ValueType,它就不能接受null值,如果你想强制struct接受null值,你应该把它定义为Nullable。

Struct Person
{
    public string Name;
}

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