【发布时间】:2015-10-05 13:40:12
【问题描述】:
我想知道有没有区别
DateTime? obj
和
Nullable<DateTime> obj
如果是的话,它们的用例是什么?
【问题讨论】:
我想知道有没有区别
DateTime? obj
和
Nullable<DateTime> obj
如果是的话,它们的用例是什么?
【问题讨论】:
没有区别。前者是后者的语法糖。它们编译成完全相同的东西,Nullable<DateTime>,构建相同的 IL。
void Main()
{
DateTime? test1 = DateTime.Now;
Nullable<DateTime> test2 = DateTime.Now;
}
DateTime? 的 IL
IL_0001: ldloca.s 00 // test1
IL_0003: call System.DateTime.get_Now
IL_0008: call System.Nullable<System.DateTime>..ctor
Nullable<DateTime> 的 IL
IL_000E: ldloca.s 01 // test2
IL_0010: call System.DateTime.get_Now
IL_0015: call System.Nullable<System.DateTime>..ctor
【讨论】:
没有区别。 DateTime? 是写 Nullable<DateTime> 的更短的方式。实际类型为Nullable<DateTime>
【讨论】:
语法 T?是Nullable{T} 的简写,其中 T 是值类型。这两种形式可以互换。
没有区别,你可以在下面反编译的 MSIL 代码中看到:
当这是原始来源时:
static void Main(string[] args)
{
DateTime? time = null;
Nullable<DateTime> obj = null;
if (false)
{
Console.WriteLine(time + " " + obj);
}
}
两者都编译为Nullable<DateTime>。 DateTime? 只是语法糖。
【讨论】:
来自MSDN:
可空类型可以表示底层类型的所有值,并且 一个额外的空值。可空类型声明为以下两种之一 方式:
System.Nullable
变量 -或-
T?变量
意味着它们是等价的。但是,此行为并非特定于类型 DateTime,而是特定于任何其他值类型。
【讨论】: