2

以下是拆箱前检查的两种常用方法。

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_Equalityceq不是引用相等检查吗?

更新

其实还有第三种方式。(简而言之,来自 C# 5.0)

MyValueType? x = myObject as MyValueType?;

然后检查x.HasValue并使用x.Value

您会使用这 3 个中的哪一个?

4

2 回答 2

4

我想知道为什么 C# 调用System.Type.op_Equality而不是ceq.

因为类型是按值比较的,而不是按引用。内存中可能有两个类型对象引用相同的类型。

你会使用这三个中的哪一个?

如果您想知道一个实例是否属于特定类型,则有一个专门设计用于解决该问题且仅解决该问题的运算符:is。您为什么使用专门为解决您的问题而设计的工具?如果您要更换屋顶并且可以在屋顶斧头和锤子之间进行选择,我希望您会使用屋顶斧头。

现在,如果您需要进行类型测试并获取值,那么我会倾向于使用as,因为这是专门为解决该问题而设计的运算符。

于 2013-07-14T15:01:01.167 回答
0

如果==存在重载运算符,则首选它。如果不是,那有什么意义呢?

除了进行测量以找出更快的方法外,我认为类型相等检查会更快,因为 JIT 包含一个特殊的优化,可以识别这种模式并最大限度地优化它。另一方面,isinst如果 JIT 识别出您正在转换为值类型(它不可能有子类型),则可能会将其编译为相同的指令。

您的第三种检查方法无法击败第二种检查方法,因为您需要 JIT 比以前做更多的事情。充其量这会优化回第二种形式,但鉴于当前 JIT 的优化能力很差,我会感到惊讶。

于 2013-07-13T21:36:29.540 回答