我在很多采访中一再被问到以下问题......但仍然无法用简单的例子来解释......
有什么建议吗?
答案 0 :(得分:33)
来自Using Nullable Types (C# Programming Guide)(链接已更新circa 2018)
有关何时可以使用的示例 可空类型,考虑如何 普通的布尔变量可以有两个 值:真和假。没有 表示“未定义”的值。在 大多数编程应用程序 特别是数据库交互, 变量可以存在于未定义的中 州。例如,a中的字段 数据库可能包含值true 或者是假的,但它也可能包含否 价值。同样,参考 可以将types设置为null以指示 他们没有初始化。
答案 1 :(得分:19)
Null表示“无价值”或“无数据”。当“无值”是您正在设计/使用的任何系统的上下文中的有效值时,您使用可空类型。
int? weightOfCargo = TryGetTruckCargoWeight()
在这种情况下,可空类型表示TryGetTruckCargoWeight()可能返回null。这通常意味着数据不可用(可能没有卡车,可能没有称重等)。
答案 2 :(得分:9)
请考虑以下示例:
工具具有通过UI指定的设置。但是,也可以从命令行运行该工具,并且可以通过命令行覆盖UI中指定的设置。所以代码如下:
bool? setting1;
...处理命令行,如果设置指定do:
setting1.Value = setting;
...后
if(setting1.HasValue)
ui.setting1 = setting1.Value
答案 3 :(得分:4)
每当使用指定值表示空值时:
* DateTime最小值表示没有任何值的值
* -1表示整数的未设置值
那么可空类型将是更好的选择。
答案 4 :(得分:4)
我们都知道C#中有两种不同的类型
•参考类型
•值类型
引用类型可以表示为不存在的值(NULL)但是Vaue类型,但不能表示NULL值
例如,
由于String是引用类型,因此您可以将其声明为null
String s=null; //ok
但是如果你试图将值类型如Int32声明为null则会产生编译器错误
Int32 i=null; // compiler error
要在值类型中表示null,必须使用称为可空类型的特殊构造。它用?代表?符号。
Int32? I=null; //now its ok
现在可以使用可空类型的情况是在数据库编程中,其中calss映射到具有可空列的表。
•如果列是String的引用类型,例如(电子邮件地址和客户地址),则没有问题,因为您可以在C#中将其定义为null
•但如果列的值是双精度值(例如(客户帐户余额)),则不能使用可空类型将其映射到C#。
例如
//映射到数据库中的Customer表
public class Customer
{
...
public decimal? AccountBalance;
}
答案 5 :(得分:3)
又一个例子:
想象一下,您需要在BLL中创建一个GetArticles
方法。此方法应采用日期(from
和to
参数),搜索字符串(search
参数)和文档类别(categoryId
参数)等参数。所有这些参数都是可选的。因此,在一种情况下,您只想定义from
和search
参数,而只在其他categoryId
参数中定义。
为此,您可以使用必要的参数组合为GetArticles
方法创建大量重载。另一种方法是为此定义唯一一个方法GetArticles(DateTime? from, DateTime? to, string search, int? categoryId)
。在这种情况下,如果参数为null
,则会跳过它。
因为我知道名为optional parameters and named arguments的.NET 4.0
中的新功能,但在此之前,这对我来说是一个不错的解决方法。
答案 6 :(得分:2)
C#有两种类型的数据类型。值类型和引用类型。 String是引用类型,int是值类型。可以为引用类型指定空值,如string s = null;
。但是您不能将null值直接赋给整数。与int a = null //
类似,因此要使值类型接受空值,可以使用可空类型。要使其可为空,请在
?
? a = null;//ok.
答案 7 :(得分:1)
// to replace
// if(foo.Id > 0)
if(foo.Id.HasValue)
{
Update(foo);
}
else
{
Insert(foo);
}
答案 8 :(得分:1)
我认为,如果我们在数据库表中包含可以为空的列时讨论真实场景,则需要创建DTO(数据传输对象)作为Db实体映射。在这种情况下,您需要在实体类中获得完全相同的数据类型映射。要实现此类需求,可空类型对于创建完全相同的映射非常有用,并且允许用户轻松地在此senario中工作。
问候。