私は答えがNOだと思いますか?もし存在しなければ、なぜDelegate
とMulticastDelegate
のクラスを分けたでしょうか?他の.NET言語のためにもう一度やりましたか?C#でマルチキャストディレクションではないデリゲートがありますか?
答えて
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を言及している。)
いいえ、CLRは許可していません。
私は彼らが直接Delegate
を公開したかったことを思い出しましたが、それは決して必要ではありませんでした。
いいえ、すべての代議員が当然Delegate.Combine
にできる必要があります。デリゲートは単純に、非マルチキャスティング機能を基本クラスにラップするだけです。
すべてのデリゲートに単一のメソッドポインタとターゲットがあっても、Delegate.Combineを実装することは可能です。オブジェクトを作成して、適切なデリゲート型の2つのフィールドを作成します。 MulticastDelegatesを使用すると、多数のサブデリゲートを持つ代理人が頻繁に実行されますが、結合と削除はほとんど行われませんが、より典型的な状況でパフォーマンスが向上する場合は、驚くでしょう。個人的には、変更可能な "イベントリスト"型、おそらく単一のフィールドを持つ構造体があったと思います... – supercat
... null型、単一のデリゲート、またはデリゲートの配列を保持できるObject型のオブジェクトこのフィールドには、そのフィールドを適切に呼び出すメソッドと、スレッドセーフな追加と削除の操作(Interlockedを使用する)が含まれています。CompareExchange);呼び出しメソッドは、最初の例外で停止するか、すべてのハンドラーを実行させ、実行中に発生したすべての例外のリストを含むBundledExceptionをスローするかの選択を提供する必要があります。イベントリストに代理参照を保持すると、メソッドやターゲットのリストではなく、既存のアプローチの不具合がなくなります。 – supercat
System.MuticastDelegateがSystem.Delegateから誘導されます。 デリゲート階層内の各レベルは、異なる一連のサービスを提供します。 System.Delegateは、特定のオブジェクトで呼び出すメソッドのデータのコンテナです。 System.MulticastDelegateを使用すると、単一オブジェクトのメソッドを呼び出すだけでなく、オブジェクトのコレクションを呼び出すことができます。これにより、複数の加入者がイベントに参加できます。
私はあなたの質問に答えました。
GetInvocationList(明らかに*複数の*メソッドを呼び出すことについて)がDelegateの一部であり、MulticastDelegateでない理由を説明するのは適切ですが... –
- 1. C#でデリゲートに出入りするものは何ですか?
- 2. 弱いデリゲートはゼロになります
- 3. NSResponderデリゲートのようなものはありますか?
- 4. c#同じ入出力形式の組み込み/デフォルトのデリゲートがありますか? 'Transform'デリゲートのように?
- 5. 単純なデリゲートであれば、ゲッターの戻り値をキャッシュする必要がありますか?
- 6. UIAlertViewのデリゲートが機能しないのはなぜですか?
- 7. Windows 7ではC:とC:\の違いはありますか?
- 8. Cocoaのデリゲートとは何ですか?なぜそれらを使用する必要がありますか?
- 9. デリゲートをクラス内でnilに設定する必要がありますか?
- 10. どのメソッドでUITextFieldのデリゲートを設定する必要がありますか?
- 11. extern "C"はC言語で効果がありますか?
- 12. なぜメモリリークがありますか? (C)
- 13. C++で新しい戻り値(void *)がありますか?
- 14. CALayerデリゲートで何ができますか?
- 15. イベントのデリゲートを取得する方法はありますか
- 16. finallyブロックがC#で実行されない状況はありますか?
- 17. C++ 11ではなくC++ 03でコードにシーケンスポイントがある状況はありますか?
- 18. C intellisenseはサポートしていますが、C++をサポートしていない適切なIDEはありますか?
- 19. "アクション"デリゲートを新しいメソッドにリファクタリングする必要がありますか?
- 20. デリゲートのプレフィックスをいつ「静的」にする必要がありますか?
- 21. C#で "Javascriptコンテキスト"のようなものがありますか
- 22. UIViewControllerAnimatedTransitioningデリゲート内で、transitionContext.fromViewControllerがnilである
- 23. ヤフーオプションデータはRですがエラーがありますか? PythonやC#でより良い例ですか?
- 24. JSONKitとデリゲートに問題がある人は誰ですか?
- 25. Kが少ないAgdaはあまり強力ではありませんか?
- 26. Rustにはデバッグマクロがありますか? Cでは
- 27. Cの文字がないC++形式の言語はありますか?
- 28. Pythonにはモジュールがありますが、C++には何がありますか?
- 29. Objective-Cデリゲートには、通常retainの代わりにassignプロパティが指定されるのはなぜですか?
- 30. C#でのジェネリックリストのフィルタリング:静的なデリゲート(述語)の方が高速ですか?
PEVerifyは 'Foo'を使ってそのアセンブリについて何を言いますか? – leppie
@leppie:まだ試していない。私はilasm/ildasmをテストデリゲートに使用し、あなたの答えに期待される結果を得ました。(私はILを取得するために "通常の"宣言でildasmを実行した後、それを改変して再ilasmedしました。) –
。ありがとう。 –