2015-10-04 5 views
5

私は、ほとんどのデベロッパーがコールバックのイベントを使用していることに気付いています。デリゲート宣言の正しい/より良い方法はどちらですか

私は開発者のコ​​ードのほとんどに気づいたが、このようになります。

public delegate void SampleDelegate(); 
public static event SampleDelegate SampleEvent; 

私のやり方ながら 『イベント』は次のようになります。

public delegate void SampleDelegate(); 
public SampleDelegate SampleEvent; // notice that I didn't set to static and not an event type 

私は誰かが何私に説明することができ願っています両方のコードの違いは?デリゲートを行うのはどちらが良い方法ですか?静的に設定する方が良いですか?

+0

私が見たイベントのほとんどは、インスタンスに関連しています。実際には、私が見た静的イベントは思い出せません(しかし、ここには何かがあるかもしれません...) –

答えて

4

はのは、あなたのコードを見てみましょう:

public delegate void SampleDelegate(); 
public SampleDelegate SampleEvent; 

それはイベントではありません。あなたは外に含むクラスをSampleEvent を呼び出すことができますので:

public class TestClass 
{ 
    public delegate void SampleDelegate(); 
    public SampleDelegate SampleEvent; 
} 

public void TestMethod() 
{ 
    var a = new TestClass(); 
    a.SampleEvent(); 
} 

また、あなたは新しい値に設定することができます

public void TestMethod() 
{ 
    var a = new TestClass(); 
    a.SampleEvent = null; 
} 

そして、これは、イベントの動作ではありません。実際のイベントのためにevent単語を追加する - だから、正しい方法を

public interface ITestInterface 
{ 
    //TestClass.SampleDelegate SampleEvent; //does not compile 
} 

public class TestClass : ITestInterface 
{ 
    public delegate void SampleDelegate(); 
    public event SampleDelegate SampleEvent; 

    private void FireEvent() 
    { 
     var handler = SampleEvent; 
     if (handler != null) 
      handler(); 
    } 
} 

public interface ITestInterface 
{ 
    event TestClass.SampleDelegate SampleEvent; 
} 

をそして今、あなただけ含むクラスからそれを呼び出すことができます。 インタフェースは、この「イベント」を含めることはできません

public void TestMethod() 
{ 
    var a = new TestClass(); 
    //a.SampleEvent(); //does not compile 
    a.SampleEvent += A_SampleEvent; //subscribe to event 
} 

private void A_SampleEvent() 
{ 
    Console.Write("Fired"); //fired when FireEvent method called 
} 

したがって、デリゲートとイベントの違いを理解する必要があります。さまざまな状況に応じて適切な方法を選択してください: イベント - いくつかの変更について他のクラス(1つまたは複数)にnodifyする必要がある場合。 Delegetes - メソッドのシグネチャを宣言し、実装を外部から渡すだけの場合(簡略化された説明)。

+1

私たちは「正しい」方法について話している間に、追加するだけですイベントは常に2つのパラメータを持つ必要があります。 'object sender'と' EventArgs args'またはそれから派生したオブジェクトです。 –

関連する問題