私は答えが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. NSResponderデリゲートのようなものはありますか?
- 2. 単純なデリゲートであれば、ゲッターの戻り値をキャッシュする必要がありますか?
- 3. Cocoaのデリゲートとは何ですか?なぜそれらを使用する必要がありますか?
- 4. C++で新しい戻り値(void *)がありますか?
- 5. extern "C"はC言語で効果がありますか?
- 6. どのメソッドでUITextFieldのデリゲートを設定する必要がありますか?
- 7. デリゲートをクラス内でnilに設定する必要がありますか?
- 8. CALayerデリゲートで何ができますか?
- 9. C intellisenseはサポートしていますが、C++をサポートしていない適切なIDEはありますか?
- 10. イベントのデリゲートを取得する方法はありますか
- 11. C++ 11ではなくC++ 03でコードにシーケンスポイントがある状況はありますか?
- 12. ヤフーオプションデータはRですがエラーがありますか? PythonやC#でより良い例ですか?
- 13. "アクション"デリゲートを新しいメソッドにリファクタリングする必要がありますか?
- 14. デリゲートのプレフィックスをいつ「静的」にする必要がありますか?
- 15. Pythonにはモジュールがありますが、C++には何がありますか?
- 16. Cの文字がないC++形式の言語はありますか?
- 17. コンポーネントサービスCOM + C#あまり正しくないものはありますか?
- 18. JSONKitとデリゲートに問題がある人は誰ですか?
- 19. C++で "typedef"という意味がありますか?
- 20. C#にはすでにConditional Zip関数がありますか?
- 21. Objective-Cデリゲートには、通常retainの代わりにassignプロパティが指定されるのはなぜですか?
- 22. C#でのジェネリックリストのフィルタリング:静的なデリゲート(述語)の方が高速ですか?
- 23. ファイルセパレータが "/"でないプラットフォームはありますか?
- 24. JavaScript DOMがアクセスできないCSSプロパティはありますか?
- 25. C/C++ではopen()でファイルを開く必要がありますか?
- 26. デリゲートに追加された関数が静的である必要があるのはなぜですか?
- 27. はboost :: lockfree :: queueであり、C++ 11ではロックフリーではありませんか?
- 28. なぜGuidはC#のオブジェクトではありませんか?
- 29. C#プロジェクトとC#プロジェクト間でポインタを渡すと、C#プロジェクトで安全でない場合があります。
- 30. Javaには自動プロパティがありますか? C#で
PEVerifyは 'Foo'を使ってそのアセンブリについて何を言いますか? – leppie
@leppie:まだ試していない。私はilasm/ildasmをテストデリゲートに使用し、あなたの答えに期待される結果を得ました。(私はILを取得するために "通常の"宣言でildasmを実行した後、それを改変して再ilasmedしました。) –
。ありがとう。 –