2017-09-01 8 views
0

変なふうに私は簡単な質問のようですが、ドキュメントやウェブ上で答えを見つけることができていない登録解除します。C#のイベント、事前登録なし

は想像私が交流#イベントに登録条件ブロック:この例では

void Execute() 
{ 
    if(loader.AlreadyCompleted) 
    { 
     DoSomething(); 
    } 
    else 
    { 
     loader.Completed += DoSomething; 
    } 
} 

、ローダはCompletedイベントをトリガします。既に発生している場合はAlreadyCompletedが真となり、それ以外の場合はfalseとなり、DoSomethingを実行する前に待機するためにCompletedイベントに登録します。

ここで、いつでも起動できるAbort関数があるとします。 Abort関数では、Completedイベントから登録を解除する必要があります。ローダーが起動時に準備ができていたし、私たちはラインloader.Completed += DoSomething;を実行したことがない場合はどうなりますか

void Abort() 
{ 
    loader.Completed -= DoSomething; 
} 

登録されていないイベントの登録を解除できますか?登録されているか確認する方法はありますか?この場合のベストプラクティスは何ですか?

+0

あなたはそれを試しましたか?この質問は私にはあまりにも理論的すぎて、広すぎます。 –

+0

私は尋ねるときにそれを試していなかった。私はStackOverflowで答えを見つけられなかったので、私はこの情報を探しているのは確かに唯一の人ではないので、私は尋ねることにしました。私はそれが重複していることを見ているだけです。それは、「購読する」の代わりに「登録する」という用語を使用して検索したためです。私の間違いです。 –

+0

[mcve]は何かをお読みください。 –

答えて

2

登録されていないイベントを登録解除しようとすると、何も起こりません。これは、loader.Completed -= DoSomething;に電話すると、実際にはloaded.Completed = (Completed)Delegate.Remove(DoSomething)と言っているという考えによるものです。 追加されなかったイベントハンドラを削除しようとすると、Delegate.RemoveはNULLを返します。このハンドラは、loaded.Complete = nullを設定します。

+0

これをバックアップするには[このオンラインの例](http://rextester.com/RGA8745)をチェックし、 –