c# now格式 - “DateTime?”在C#中意味着什么?




datetime使用 c#时间类 (6)

由于DateTimestruct而不是class ,因此在声明该类型的字段或变量时,将获得DateTime 对象 ,而不是引用 。 并且,与int不能为null方式相同,此DateTime对象也不能为null,因为它不是引用。

添加问号会将其转换为可空类型 ,这意味着它既可以是DateTime对象, 可以为null

DateTime?Nullable<DateTime>语法糖,其中Nullable本身就是一个struct

我正在阅读.Net书籍,在其中一个代码示例中,有一个带有此字段的类定义:

private DateTime? startdate

DateTime? 意思?


它相当于Nullable <DateTime>。 你可以附加“?” 任何原始类型或结构。


我们知道,DateTime是一个结构意味着DateTime是一个值类型,所以你得到一个DateTime对象,而不是一个引用,因为DateTime不是一个类,当你声明一个字段或该类型的变量时,你不能用null初始化因为值类型不接受null。 与int一样,不能为null。 所以DateTime对象永远不会为null,因为它不是引用。

但有时我们需要可空变量或值类型字段,那时我们使用问号使它们成为可空类型,因此它们允许null。

例如:-

约会时间? date = null;

诠释? intvalue = null;

在上面的代码中,变量日期是DateTime的对象,或者它是null。 对于intvalue也是如此。


它基本上为你提供了原语的额外状态。 它可以是值,也可以为null。 在不需要分配值的情况下,它可能很有用。 因此,不是使用例如datetime.min或max,而是将其赋值为null以表示无值。


这是一个可以为空的DateTime。 ? 在原始类型/结构表明它是可以为空的版本之后。

DateTime是一个永远不能为null的结构。 来自MSDN

DateTime值类型表示日期和时间,其值范围为午夜12:00,1月1日,0001 Anno Domini或AD(也称为Common Era,或CE)至9999年12月31日晚上11:59:59 AD(CE)

DateTime? 但是可以为null。


这只是对其他答案的补充。 我不会重复他们(现在四年后)。

有些情况下const和non-const具有不同的语义。 例如:

const int y = 42;

static void Main()
{
  short x = 42;
  Console.WriteLine(x.Equals(y));
}

打印出True ,而:

static readonly int y = 42;

static void Main()
{
  short x = 42;
  Console.WriteLine(x.Equals(y));
}

False

原因是x.Equals方法有两个重载,一个取shortSystem.Int16 ),另一个取objectSystem.Object )。 现在的问题是一个或两个是否适用于我的论点。

y是一个编译时常量(literal)(常量)时,只要int是一个常量,确实存在 int short的隐式转换就很重要,并且假定C#编译器验证其值在short的范围(其中42是)。 请参阅C#语言规范中的隐式常量表达式转换 。 所以这两个过载都必须考虑。 Equals(short)是首选(任何short都是一个object ,但并非所有object都是short )。 所以y被转换为short ,并使用超载。 然后Equals比较两个相同的价值short ,而且这是true

y不是常数时,不存在从intshort 隐式转换。 这是因为一般而言, int可能太大而不适合short 。 ( 显式转换确实存在,但我没有说Equals((short)y) ,所以这不是相关的。)我们看到只有一个重载适用,即Equals(object) 。 所以y被装箱来object 。 然后Equals将比较一个System.Int16到一个System.Int32 ,并且由于运行时类型甚至不同意,这会产生false

我们得出结论:在一些(罕见)情况下,将const类型成员更改为static readonly字段(或者,如果可能的话)可以更改程序的行为。





c# .net datetime syntax nullable