2011-01-17 5 views

答えて

13

EDIT:I これはECMA 335の一部ですが、どこにも表示されません。 ILに

あなたはC#で、このようなデリゲート型を作成することはできませんが、次のことができます。

using System; 

class Test 
{ 
    static void Main() 
    { 
     Foo f = x => Console.WriteLine(x); 
     f("hello"); 
    } 
} 

しかしCLR:

.class public auto ansi sealed Foo 
     extends [mscorlib]System.Delegate 
{ 
    // Body as normal 
} 

C#コンパイラは、このようなデリゲートを使用して問題がありません

未処理の例外:System.TypeLoadException:アセンブリ 'Foo、Versionから' Foo '型を読み込めませんでした。 = 0.0.0.0、Culture =ニュートラル、PublicKeyToken = null 'これはデリゲートクラスから直接継承できないためです。 at Test.Main

基本的に、委任者/マルチキャスト配信者の分離は歴史的な事故です。初期のアルファ版とベータ版では区別がつきましたが、あまりにも混乱し、一般的には役に立たないとわかったので、すべてデリゲートはMulticastDelegateから派生しています。

(興味深いことに、C#の仕様は、一般的な制約として使用することができないタイプのリストに、一度MulticastDelegateを言及している。)

+0

PEVerifyは 'Foo'を使ってそのアセンブリについて何を言いますか? – leppie

+0

@leppie:まだ試していない。私はilasm/ildasmをテストデリゲートに使用し、あなたの答えに期待される結果を得ました。(私はILを取得するために "通常の"宣言でildasmを実行した後、それを改変して再ilasmedしました。) –

+0

。ありがとう。 –

1

いいえ、CLRは許可していません。

私は彼らが直接Delegateを公開したかったことを思い出しましたが、それは決して必要ではありませんでした。

2

いいえ、すべての代議員が当然Delegate.Combineにできる必要があります。デリゲートは単純に、非マルチキャスティング機能を基本クラスにラップするだけです。

+0

すべてのデリゲートに単一のメソッドポインタとターゲットがあっても、Delegate.Combineを実装することは可能です。オブジェクトを作成して、適切なデリゲート型の2つのフィールドを作成します。 MulticastDelegatesを使用すると、多数のサブデリゲートを持つ代理人が頻繁に実行されますが、結合と削除はほとんど行われませんが、より典型的な状況でパフォーマンスが向上する場合は、驚くでしょう。個人的には、変更可能な "イベントリスト"型、おそらく単一のフィールドを持つ構造体があったと思います... – supercat

+0

... null型、単一のデリゲート、またはデリゲートの配列を保持できるObject型のオブジェクトこのフィールドには、そのフィールドを適切に呼び出すメソッドと、スレッドセーフな追加と削除の操作(Interlockedを使用する)が含まれています。CompareExchange);呼び出しメソッドは、最初の例外で停止するか、すべてのハンドラーを実行させ、実行中に発生したすべての例外のリストを含むBundledExceptionをスローするかの選択を提供する必要があります。イベントリストに代理参照を保持すると、メソッドやターゲットのリストではなく、既存のアプローチの不具合がなくなります。 – supercat

2

System.MuticastDelegateがSystem.Delegateから誘導されます。 デリゲート階層内の各レベルは、異なる一連のサービスを提供します。 System.Delegateは、特定のオブジェクトで呼び出すメソッドのデータのコンテナです。 System.MulticastDelegateを使用すると、単一オブジェクトのメソッドを呼び出すだけでなく、オブジェクトのコレクションを呼び出すことができます。これにより、複数の加入者がイベントに参加できます。

私はあなたの質問に答えました。

+2

GetInvocationList(明らかに*複数の*メソッドを呼び出すことについて)がDelegateの一部であり、MulticastDelegateでない理由を説明するのは適切ですが... –

関連する問題