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).
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 ...) –