31

今日、同僚から興味深い質問がありました。C# のキーワード/演算子は "リフレクション" と見なされますか?

object tmp = "a string";
if(tmp is String)
{
}

このオペレーターは舞台裏でどのように実装されていますか? 反省や内省が必要ですか?それとも、言語の厳密に型指定された性質のために、オブジェクトの Type は、メモリ内のオブジェクトの最上位属性としてすぐにアクセスできますか?

MSDNは次のように述べています。

is 演算子は、参照変換、ボックス化変換、ボックス化解除変換のみを考慮することに注意してください。ユーザー定義の変換など、その他の変換は is 演算子では考慮されません。

ボックス化されたコンバージョンとボックス化されていないコンバージョンを考慮する能力は、ある種の内省を暗示しているように思えます。

4

3 に答える 3

39

ECMA-335 を参照して、isオペレーターはisinstオブジェクト モデル IL 命令 (パーティション III §4.6) を生成します。これは、リフレクション ライブラリ (パーティション IV §5.5) の一部ではなく、基本命令セットの一部です。

編集:isオペレーターは、リフレクション ライブラリと比較して非常に効率的です。リフレクションを使用すると、基本的に同じテストをよりゆっくりと実行できます。

typeof(T).IsAssignableFrom(obj.GetType())

castclass編集 2:およびisinst手順の効率について正しくありません(投稿から編集しました)。これらは、実際の VM 実装で高度に最適化されています。関連する唯一の実際のパフォーマンスの問題はcastclass、例外がスローされる可能性です。これは、C#as演算子とテストnull(参照型の場合) またはis演算子の後にキャスト (値型の場合) を使用することで回避できます。

于 2009-07-15T21:09:22.033 に答える
5

オペレーターはis基本的にキャストが可能かどうかを判断しますが、キャストが不可能な場合は例外をスローする代わりに、 を返しますfalse。リフレクションをキャストすることを検討する場合、これもリフレクションです。

編集:

いくつかの調査の結果、演算子が命令にマップされているcastclass間、IL på 命令でキャストが実行されることがわかりました。FxCop には、最初に を使用してから命令を使用して、不必要なキャストを行っている場合に警告するルールがあります。操作は効率的ですが、それでもパフォーマンス コストがかかります。isisinstisinstcastclass

于 2009-07-15T20:59:45.203 に答える
1

他の言語には、動的キャストをサポートするのに十分な実行時間情報がありますが、リフレクションとして説明できるものはありません (C++ は明らかな例です)。

したがって、リフレクションとは、単にオブジェクトの型を発見する以上の追加機能を指します。たとえば、オブジェクトを「反映する」とは、そのメンバーを歩く能力を意味します。

于 2009-07-15T21:03:12.870 に答える