delegate
キーワードはC#で使用する場合、C#コンパイラが自動的System.MulticastDelegate
クラスから派生したクラスを生成が含ま生成しました。コンパイラは、代表キーワードの密封されたクラスは仮想メソッド
このコンパイラ生成されたクラスは、同様に3つのメソッドが含まれています:Invoke, BeginInvoke and EndInvoke
。
すべてのこれらの3つの方法がpublic virtual extern
をマークされているが、興味深いことに、クラス自体はsealed
マークされます。密閉されたクラスで定義され
仮想メソッドは直感に反するよう打つが、C#で、実際に違法であるだけではなく。
だから私の質問は、このための具体的な理由がある場合、またはそれだけで心の中でいくつかの仮定の将来の拡張を維持行われ、それらの無害なものの一つですか?
編集1:
理由は対照的に、そのデリゲートオブジェクトは常に3のいずれかを実行しようとする前に、CLRによりnullをチェックされているので「と呼ぶ」から「callVirt」IL命令コードの使用を強制することができます方法?この点に関して私はdelegate
が特別なケースであるべき理由を見逃していますが。
(それが微小であってもよいが)、
callvirt
の使用を強制するために、パフォーマンスヒットしなかった編集2:
追加さCILタグ、それが委任を定義するC#の方法が判明として実際にはCIL標準によって義務づけられています。標準の状態(次は全文ではない)
代表者は基本型System.Delegateを持ちます。参加者は 密封さ宣言されなければならない、とここで指定したとしてデリゲートを持たなければならない唯一のメンバーは、最初の2つのまたはすべての4つの方法のいずれか です。これらの メソッドは、実行時に宣言され、管理されなければならない。その本体はVESによって自動的に作成されるため、本体には 本体はありません。デリゲートで利用可能なその他の メソッドは、基底クラスライブラリの System.Delegateクラスから継承されます。デリゲートメソッドは、次のとおり
- インスタンスコンストラクタ
- はInvokeメソッドは、仮想
- なければならない存在する場合EndInvokeをメソッドが仮想なければならない、BeginInvokeを法仮想
- なければなりません
これは間違いなくコンパイラプロセスの副作用ではなく、他の興味深いコンパイラ出力と同様です。
標準が何かを強調しているのなら、何らかの正当な理由と根拠が必要です。
ここで質問はなぜ、デリゲートのCIL標準が密封と仮想で同時に強調されるのでしょうか?その体は、VESによって自動的に作成されなければならないので、
は、ここでキャッチ嘘?:
をい彼らは、ボディを持っていてはなりません。
VES/CLR生成ボディがこれらのメソッドの呼び出し時に実行されるように仮想マークが付けられていますか?
Cで有効でないものは、ILで完全に有効である可能性があることを忘れないでください。他のインスタンスが現在あります。これは別の可能性があります。しかし興味深いのは+1です。 –
私はそれをILDasmで試して、overrideキーワードはILでvirtualに変換されています。 – MBen
@MBenはい、C#で生成されたデリゲートクラスの場合、オーバーライドする対応する基本クラスのメソッドはありません。したがって、ここでの仮想キーワードは 'override'の結果ではありません:) –