我阅读Nullable Structure并了解其中的大部分内容。但我不知道人们何时以及为何会使用它。
答案 0 :(得分:5)
C#具有引用类型(类)和值类型的概念(结构和内置类型,例如int
,bool
,DateTime
等。)。
引用类型可以有null
值,表示它们尚未分配(或者它们具有" no"值)。
值类型最初没有可空值的概念。它们在某些上下文中具有默认值(例如,类中的int
字段的默认值为0)。但是,他们没有" no"值。
输入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