キーワードがC#で使用されている場合delegate
、C#コンパイラはクラスから派生したクラスを自動的に生成しSystem.MulticastDelegate
ます。
このコンパイラで生成されたクラスには、次の3つのメソッドも含まれていますInvoke, BeginInvoke and EndInvoke
。
これら3つのメソッドはすべてマークされていますpublic virtual extern
が、興味深いことに、クラス自体がマークされていsealed
ます。
封印されたクラスで定義された仮想メソッドは、直感に反するだけでなく、C#では実際には違法です。
だから私の質問は、これには特定の理由がありますか、それともいくつかの仮想的な将来の強化を念頭に置いて行われた無害なことの1つにすぎませんか?
編集1:
その理由は、3つのメソッドのいずれかを実行しようとする前にデリゲートオブジェクトがCLRによって常にnullであるかどうかがチェックされるように、「call」ではなく「callVirt」ILオペコードの使用を強制するためでしょうか。delegate
なぜこの点で特別な場合なのかはわかりませんが。
また、使用を強制することはパフォーマンスの打撃ではありませんcallvirt
(それはごくわずかかもしれませんが)
編集2:
デリゲートを定義するC#の方法が実際にはCIL標準によって義務付けられていることが判明したため、CILタグを追加しました。標準では、(以下は全文ではありません)と述べています
デリゲートは、基本タイプがSystem.Delegateである必要があります。代議員は封印されていると宣言され、代議員が持つべき唯一のメンバーは、ここで指定されている最初の2つまたは4つすべての方法のいずれかです。これらのメソッドは、実行時に宣言され、管理されます。ボディはVESによって自動的に作成されるため、ボディを持たないものとします。デリゲートで使用可能な他のメソッドは、基本クラスライブラリのクラスSystem.Delegateから継承されます。デリゲートメソッドは次のとおりです。
- インスタンスコンストラクタ
- Invokeメソッドは仮想である必要があります
- BeginInvokeメソッドは、存在する場合、仮想である必要があります
- EndInvokeメソッドは仮想である必要があります
したがって、これはコンパイラプロセスの副作用ではないか、他の興味深いコンパイラ出力に似ています。
標準が何かを強調している場合、それは何らかの正当な理由と論理的根拠によるものでなければなりません。
では、問題は、なぜ代表者向けのCIL標準が、封印されたものと仮想的なものを同時に強調するのかということです。
キャッチはここにありますか?:
ボディはVESによって自動的に作成されるため、ボディを持たないものとします。
これらのメソッドの呼び出し時にVES/CLRで生成された本体を実行できるように、仮想としてマークされていますか?