为什么它不允许分配null DateTime在C#?怎么这已经实施?和这个特征可以被用来使自己的类非空?

例如:

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

我知道,我可以使用 DateTime? C#2.0允许空分配给dateTimeTest,我可以使用 Jon双向飞碟的非空类 在我的字符串获得一个运行时间上的错误分配的stringTest.我只是想知道为什么这两类不同的行为。

有帮助吗?

解决方案

DateTime是数值类型(struct),其中,作为字符串是一个引用类型(class等)。这是关键的区别。参考总是可以为空;的值不能(除非它使用Nullable<T> - 即DateTime?)(尤指1.1)中,尽管可以zero'd(DateTime.MinValue),其经常被解释为同样的事情,空

其他提示

日期时间是一个结构,而不是一个类。做一个“去定义”或看它在对象浏览器中看到的。

HTH!

之间的重要区别Valuetype和基准类型,值类型有这些"值语".DateTime,Int32和所有其他价值的类型没有身份,Int32"42"是基本上不可区分从任何其他Int32有同样的价值。

所有价值类型的"对象"存在,无论是在堆或作为其一部分的参考类型的对象。一个特殊的情况是当你把一个数值类型实例的对象或一口-这就是所谓的"拳击",并且它只是创建一个虚拟参考型对象,它只包含的价值,可以取回("装箱").

基准类型,另一方面,有一个标识。一个"新对象()"并不等于任何其他"新的对象()",因为他们是独立的情况下GC上堆。一些参考类型提供平等的方法和过载运营,使他们的行为更值一样,例如。a String"abc"等其他"abc"串的即使他们实际上是两个不同的对象。

所以,当你有一个参考,它可以包含该地址的一个有效的对象,或者它可以为空。当值类型的对象是所有零的,他们只是零。例如。一个整数为零,浮零,Boolean false,或DateTime。MinValue.如果你需要区分"零"和"缺失值/null",你需要使用一个独立的布尔国旗,或者,更重要的是,使用可空的<T> 类。网2.0.这是简单的价值再加上一个布尔的标志。还有支持在CLR使拳的可空与HasValue=false结果在一个空的参考,而不是在一个盒装结构的虚假+零,因为它将如果你执行这个结构自己。

日期时间是一个值类型,相同作为int。只有引用类型(如字符串或MyCustomObject)可以为空。引用类型真“的引用”存储在堆上的对象位置。

这里的href="http://www.albahari.com/valuevsreftypes.aspx" rel="nofollow noreferrer">文章,我发现更好的解释了它一个 MSDN文章p>

有关值类型为空,必须有一定的价值它可以容纳这将没有其他合法的意义,和,系统会以某种方式知道应被视为“空” 。有些值类型能够满足第一个条件,而无需任何额外的存储空间。如果.NET已经从底层向上设计可空值的概念出发,它可以有Object include a virtualIsLogicalNullproperty, and a non-virtualIsNullwhich would returntrueifthisis null and, otherwise invoke itsIsLogicalNullproperty and return the result. If .net had done this, it would have avoided the need for the quirky boxing behavior andstructconstraint ofNullable(an emptyNullablecould be boxed as an emptyNullable, and still be recognized asnull`)。

通过它是决定在.NET框架2.0提供空值类型的支持时间,但是,大量的代码被写该假设对于像GuidDateTime默认值将不被视为null。由于大部分在空类型的价值在于它们预测的默认值(即null),具有类型的有null值,但默认为别的东西,将具有比增值更混乱。

的字符串是一类,而日期时间是一种结构。这就是为什么你不能将其设置为null。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top