什么时候应该在c#中使用可空类型?

时间:2010-04-13 05:02:29

标签: c# nullable

我在很多采访中一再被问到以下问题......但仍然无法用简单的例子来解释......

  1. c#中的可空类型是什么?
  2. 何时应该在c#中使用可空类型?
  3. 你能给出一个简单的例子吗?
  4. 有什么建议吗?

9 个答案:

答案 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方法。此方法应采用日期(fromto参数),搜索字符串(search参数)和文档类别(categoryId参数)等参数。所有这些参数都是可选的。因此,在一种情况下,您只想定义fromsearch参数,而只在其他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中工作。

问候。