いくつか読んだ後、ハンドラーの呼び出し順序はサブスクライブと同じ順序であることを理解しましたが、保証されていません。
だから私が持っているとしましょう:
public event MYDEl ev;
サブスクライバーは次のことを行います。
ev+=GetPaper;
ev+=Print;
ev+=EjectPaper;
+実行リストの順序を維持するベストプラクティスメカニズムは何ですか?
いくつか読んだ後、ハンドラーの呼び出し順序はサブスクライブと同じ順序であることを理解しましたが、保証されていません。
だから私が持っているとしましょう:
public event MYDEl ev;
サブスクライバーは次のことを行います。
ev+=GetPaper;
ev+=Print;
ev+=EjectPaper;
+実行リストの順序を維持するベストプラクティスメカニズムは何ですか?
フィールドのようなイベントの場合は、のように単純なデリゲートの組み合わせを使用し、サブスクリプションの順序を維持するDelegate.Combine
ことが保証されます。戻り値のドキュメントから:
aとbの呼び出しリストをこの順序で連結する呼び出しリストを持つ新しいデリゲート。
一般に、イベントの場合、何も保証されません。実装次第です。一体、それはあなたがこれまでに作ったすべてのサブスクリプションを無視する可能性があります。ただし、実際には、適切な実装であれば順序が維持されます。
編集:いたずらイベントの実装のサンプル:
public class BadEventPublisher
{
public event EventHandler Evil
{
add { Console.WriteLine("Mwahahaha!"); }
remove { }
}
protected virtual void OnEvil(EventArgs e)
{
Console.WriteLine("Who cares? Subscriptions are ignored!");
}
}
これは、(たとえば)ゲッターから乱数を返し、セッターの値を無視するプロパティを作成するのと同じです。それは実際の問題というよりも理論的な問題です。