【发布时间】:2013-07-12 03:30:22
【问题描述】:
以下是拆箱前检查的两种常用方法。
myObject.GetType() == typeof(MyValueType)
IL_0001: callvirt System.Object.GetType
IL_0006: ldtoken UserQuery.MyValueType
IL_000B: call System.Type.GetTypeFromHandle
IL_0010: call System.Type.op_Equality
myObject is MyValueType
IL_0001: isinst UserQuery.MyValueType
另外,我想知道为什么 C# 调用 System.Type.op_Equality 而不是 ceq 这不是引用相等检查吗?
更新
其实还有第三种方式。 (简而言之,来自 C# 5.0)
MyValueType? x = myObject as MyValueType?;
然后检查x.HasValue并使用x.Value
你会使用这三个中的哪一个?
【问题讨论】:
-
翻转三面硬币?
-
我会使用哪一个?当然
myObject is MyValueType。这就是is关键字的用途。我相信编译器会选择它的神器翻译。旁注:对于值类型,两种形式给出相同的结果。但在其他情况下,当然会有所不同。例如myObject is IDisposable工作正常,而myObject.GetType()永远不能给出接口类型或抽象类。另一个例子,即使Func<>是密封类型,myObject is Func<object>也会为Func<string>提供真值。协方差。
标签: c# il value-type gettype