2015-10-04 7 views
5

Ho notato che la maggior parte degli sviluppatori utilizza l'evento per la richiamata e non sono sicuro se lo sto facendo nel modo giusto.Qual è il modo corretto/migliore per la dichiarazione dei delegati

ho notato la maggior parte dei codici di sviluppatori simile a questa:

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

Mentre il mio modo di fare 'evento' simile a questa:

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

Spero che qualcuno potrebbe spiegare a me che cosa è il differenze tra i due codici? Quale modo di fare delegato è una pratica migliore? È meglio impostarlo come statico? sguardo

+0

La maggior parte degli eventi che ho visto sono correlati all'istanza; infatti, non riesco a ricordare alcun evento statico che ho visto (ma potrebbe avere qualcosa a che fare con il tempo qui ...) –

risposta

4

Let al vostro codice:

public delegate void SampleDelegate(); 
public SampleDelegate SampleEvent; 

Non è un evento. Poiché è possibile chiamare SampleEvent di fuori la classe contenente:

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

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

Inoltre, è possibile impostare al nuovo valore:

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

E questo non è il comportamento evento. Un'interfaccia non può contenere questo "evento":

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

Quindi il modo giusto - per aggiungere event parola per eventi reali:

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; 
} 

E ora si può chiamare solo dalla classe che contiene:

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 
} 

Quindi, è necessario capire la differenza tra delegati ed eventi. E scegli il modo appropriato per le diverse situazioni: Eventi - quando devi nodificare altre classi (una o più) su alcune modifiche. Delegeti - quando si desidera dichiarare una firma del metodo e passare l'implementazione dall'esterno (spiegazione semplificata).

+1

Inchiodato, solo per aggiungere, mentre stiamo parlando del modo "giusto" per fai cose, che gli eventi dovrebbero sempre avere 2 parametri. 'oggetto sender' e' EventArgs args' o un oggetto derivato da esso. –

Problemi correlati