为什么不允许在C#中为null分配null?这是如何实现的?是否可以使用此功能使您自己的类不可为空?
例:
string stringTest = null; // Okay DateTime dateTimeTest = null; // Compile error
我知道我可以DateTime?
在C#2.0中使用以允许将null分配给dateTimeTest,并且我可以在我的字符串上使用Jon Skeet的NonNullable类来获取stringTest赋值的运行时错误.我只是想知道为什么这两种类型的行为不同.
DateTime
是一个value-type(struct
),其中-string是一个引用类型(class
etc).这是关键的区别.引用始终为null; 值不能(除非它使用Nullable
- 即DateTime?
),尽管它可以为零(DateTime.MinValue
),通常被解释为与null相同(特别是在1.1中).
DateTime是一个结构而不是一个类.做一个'去定义'或在对象浏览器中查看它.
HTH!
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