2

以下は、箱から出す前に確認するためによく使用される 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

さらに、 Isn't that reference equality check?System.Type.op_Equalityの代わりにC# が呼び出される理由が気になります。ceq

アップデート

実は、第3の方法があります。(一言で言えばC#5.0から)

MyValueType? x = myObject as MyValueType?;

次に、確認x.HasValueして使用しますx.Value

3つのうちどれを使う?

4

2 に答える 2

0

オーバーロードされた==演算子が存在する場合、それが優先されます。そうでない場合、それのポイントは何ですか?

何が速いかを測定する以外に、JIT にはこのパターンを認識して最大限に最適化する特別な最適化が含まれているため、型の等価性チェックがより高速になると思います。一方、isinst値の型 (サブタイプを持つことはできない) にキャストしていることを JIT が認識した場合、同じ命令にコンパイルされる可能性があります。

JITに以前よりも多くのことを要求しているため、3番目のチェック方法は2番目の方法に勝ることはありません。せいぜい、これは 2 番目の形式に最適化されたものですが、現在の JIT の最適化機能が貧弱であることを考えると、私はそれを見て驚くでしょう。

于 2013-07-13T21:36:29.540 に答える