if (myVariable == null)
将无法[1]与value types一起使用。请参见下面有关引用类型与值类型和struct
的简短介绍。
值类型主要是struct
(例如DateTime
),包括[2]simple types,如int
和enum
。值类型本质上不支持null
值。
异常和修复方法是可空类型:本质上,这些类型将null
添加到结构类型的可能值中。它们在结构上与其他语言中可能已知的Maybe<T>
相同[3]。您可以使用ValueType?
(例如int?
)创建它们,这是Nullable<ValueType>
的语法糖。
if (Object.Equals(myVariable, default(MyVariableType)))
这适用于引用类型(对象)和值类型。
请注意,您必须手动替换MyVariableType
- 不幸的是您不能执行此操作。
if (Object.Equals(myVariable, default(myVariable.GetType())))
因为
default()
只接受类型名称作为参数。(我猜它在编译时求值。)
结构体简介
简单来说,结构体是精简版的类。想象一下不支持继承或终结器的类,那么你就有了这个精简版:结构体。结构体的定义方式和类相同(除了使用 struct
关键字),除了前面所述的限制外,结构体可以拥有相同丰富的成员,包括字段、方法、属性和运算符。
[引自:http://www.albahari.com/valuevsreftypes.aspx]
类是引用类型:一个类变量(或更具体地说,它的内存区域)仅包含指向另一个内存区域的指针,实际的对象实例数据存储在那里。
值类型变量直接包含数据。这可能会因为 缓存局部性 和节省查找时间而带来速度优势。但在更复杂的结构体情况下,这也可能会对性能产生不利影响。
注释:
[1] 它甚至不会报错。 myVariable == null
总是会返回 false
,因为你的 myVariable
将被初始化为非 null
默认 值(零(等效)或一个由零和 null
组成的结构体)。这个默认值可以通过 default(Type)
获得。
[2] 技术上来说,简单类型(除了string
和object
之外的所有内置类型)都是结构体。顺便提一下:内置类型是System命名空间中的类型别名。
[3] 例如在Haskell中。在C#中,Maybe<T>
不是内置类型,但可以实现它。它为类和结构体都提供了Nothing
,作为一个更明确/自我说明的null
版本。
[4] 没有[4]。真的,你可以去检查。