if (myVariable == null)
不适用于[1 ]值类型 。(有关引用类型与值类型 和s
的简短介绍,请参见下文 。)struct
值类型主要是struct
s(例如DateTime
),包括[2]和erations等简单类型。值类型不支持值(本质上)。int
enum
null
例外和对此的修复是可为空的类型:本质上,这些添加null
到结构类型的可能值中。它们在结构上与Maybe<T>
您可能从其他语言中知道的[3]相同。ValueType?
您使用(eg )创建它们,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
将始终只 yield false
,因为您myVariable
将使用非null
默认值(零(等效)或零和null
s 的结构)进行初始化。此默认值适用于default(Type)
。
[2] 从技术上讲,简单类型(除and之外的所有内置类型)都是结构。旁注:内置类型是 System 命名空间中类型的别名。string
object
[3] 例如在 Haskell 中。在 C#Maybe<T>
中不是内置的,但可以实现。它为类和结构提供Nothing
了更明确/自记录的版本。null
[4] 没有[4]。没有,你可以去看看。