quanto l'appalto esterno è interessato, un evento non ha un setter, solo add
e remove
metodi - gli abbonati possono registrarsi e annullare la registrazione dalla manifestazione, e la pubblicazione di oggetto decide quando per richiamare le callback "sollevando" l'evento. Di conseguenza, l'idea di "assegnare un evento", in generale, non ha senso.
Tuttavia, quando si dichiara un evento in una classe, il compilatore C# fornisce ciò che è veramente vantaggio di funzionalità: quando non si fornisce la propria implementazione, si crea un privato, il backup delegato campo per te, insieme alle appropriate implementazioni di aggiunta/rimozione. Ciò consente di "impostare l'evento" (in realtà il campo di supporto) all'interno della classe, ma non al di fuori di esso. Per capire questo, si consideri:
public class Foo
{
// implemented by compiler
public event EventHandler MyEvent;
public static Foo FooFactory(EventHandler myEventDefault)
{
// setting the "event" : perfectly legal
return new Foo { MyEvent = myEventDefault };
}
}
public class Bar
{
public static Foo FooFactory(EventHandler myEventDefault)
{
// meaningless: won't compile
return new Foo { MyEvent = myEventDefault };
}
}
public class Baz
{
// custom implementation
public event EventHandler MyEvent
{
add { } // you can imagine some complex implementation here
remove { } // and here
}
public static Baz BazFactory(EventHandler myEventDefault)
{
// also meaningless: won't compile
return new Baz { MyEvent = myEventDefault };
}
}
Sembra che questa funzione sta per essere aggiunto nella prossima versione di lingua http://roslyn.codeplex.com/wikipage?title=Language+Feature+Status – Zarat
Se sei ancora interessato, per favore guarda il mio suggerimento qui: http://stackoverflow.com/questions/24951619/add-event-handler-during-object-initialization/37994490#37994490 –