1

MulticastDelegate と Delegate について考えていましたが、メソッドを呼び出す理由が MulticastDelegate の抽象メソッドではない理由がわかりません。誰か知ってる?

4

1 に答える 1

2

このMulticastDelegate型にはInvoke()メソッドがありません (またはBeginInvoke())。これらのメソッドはdelegate、ランタイムによって実際の型で自動的に提供されます。したがって、「なぜInvoke()メソッドがMulticlassDelegateマークされていないのか」という質問に対する最も明白な理由は、abstractそのようなメソッドがないことです。

そのメソッドが含まれていないMulticlassDelegate(そしてそこにマークされabstractている) 理由を尋ねている場合は、どうすればよいのでしょうか? Invoke()メソッドのシグネチャは特にデリゲート型のシグネチャに依存するため、デリゲート型ごとに独自のメソッドが必要です。その型を提供できる基本クラスはありません。

最後に、MulticlassDelegate型は .NET のいくつかの「特別な」型の 1 つであり、ユーザー コードによって継承されないように明示的に意図されていることに注意してください。それもdelegate、型の宣言されたサブクラスもありません。abstract継承は不可能なので、メンバーが;かどうかは問題ではありません。たとえそうだったとしても、それは誰の役にも立たないでしょう。

ドキュメントから:

Delegate クラスは、デリゲート型の基本クラスです。ただし、Delegate クラスまたは MulticastDelegate クラスから明示的に派生できるのは、システムとコンパイラだけです。また、デリゲート型から新しい型を派生させることも許可されていません。Delegate クラスはデリゲート型とは見なされません。デリゲート型を派生させるために使用されるクラスです。

ほとんどの言語はデリゲート キーワードを実装しており、これらの言語のコンパイラは MulticastDelegate クラスから派生できます。したがって、ユーザーは言語によって提供されるデリゲート キーワードを使用する必要があります。

  • 注:

    共通言語ランタイムは、デリゲートと同じシグネチャを使用して、デリゲートの種類ごとに Invoke メソッドを提供します。このメソッドは、コンパイラによって自動的に呼び出されるため、C#、Visual Basic、または Visual C++ から明示的に呼び出す必要はありません。Invoke メソッドは、デリゲート型のシグネチャを検索する場合にリフレクションで役立ちます。
于 2015-09-14T16:55:48.153 に答える