当前位置:  开发笔记 > 编程语言 > 正文

为什么C#中的DateTime不允许为null?

如何解决《为什么C#中的DateTime不允许为null?》经验,为你挑选了3个好方法。

为什么不允许在C#中为null分配null?这是如何实现的?是否可以使用此功能使您自己的类不可为空?

例:

string stringTest = null; // Okay
DateTime dateTimeTest = null; // Compile error

我知道我可以DateTime?在C#2.0中使用以允许将null分配给dateTimeTest,并且我可以在我的字符串上使用Jon Skeet的NonNullable类来获取stringTest赋值的运行时错误.我只是想知道为什么这两种类型的行为不同.



1> Marc Gravell..:

DateTime是一个value-type(struct),其中-string是一个引用类型(classetc).这是关键的区别.引用始终为null; 值不能(除非它使用Nullable- 即DateTime?),尽管它可以为零(DateTime.MinValue),通常被解释为与null相同(特别是在1.1中).



2> Simon..:

DateTime是一个结构而不是一个类.做一个'去定义'或在对象浏览器中查看它.

HTH!



3> 小智..:

ValueTypes和引用类型之间的重要区别是值类型具有这些"值语义".DateTime,Int32和所有其他值类型都没有标识,Int32"42"基本上与具有相同值的任何其他Int32无法区分.

所有值类型"对象"都存在于堆栈中或作为引用类型对象的一部分.一个特例是当你将一个值类型实例转换为一个Object或一个接口时 - 这称为"boxing",它只是创建一个虚拟引用类型对象,它只包含可以提取回的值("unboxed") .

另一方面,引用类型具有标识."new Object()"不等于任何其他"new Object()",因为它们是GC堆上的单独实例.一些引用类型提供了Equals方法和重载运算符,因此它们的行为更像值,例如.字符串"abc"等于其他"abc"字符串,即使它们实际上是两个不同的对象.

因此,当您有引用时,它可以包含有效对象的地址,也可以为null.当值类型对象全为零时,它们只是零.例如.整数零,浮点零,布尔值false或DateTime.MinValue.如果需要区分"zero"和"value missing/null",则需要使用单独的布尔标志,或者更好的是,使用.NET 2.0中的Nullable 类.这只是值加上一个布尔标志.在CLR中也有支持,因此使用HasValue = false对Nullable进行装箱会导致空引用,而不是带有false + 0的盒装结构,就像您自己实现此结构一样.

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有