Dans le cas présent, tant qu'aucun évènement n'est attaché à OnTotalChange, le Handler est null. En effet, un EventHandler n'est rien d'autre qu'un délégué. Certe, une instance sera crée lors d'une première affectation d'un évènement, mais en attendant, dans le code il faut bel et bien s'assurer de l'existance d'une telle instance.
Généralement on utiliserait plutôt un code qui ressemblerait au suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
publicclassTotalChangeEventArgs : EventArgs
{
publicdouble NewValue = 0;
}
publicdelegatevoidTotalChangeEventHandler(object Sender, TotalChangeEventArgs e);
...
publicevent TotalChangeEventHandler OnTotalChanged;
protectedvoid DoTotalChange()
{
if(OnTotalChanged!=null)
{
TotalChangeEventHandler e = new TotalChangeEventHandler();
e.NewValue = Total;
OnTotalChanged(this,e);
}
}
privatedouble _total;
publicdouble Total
{
get
{
object o = _total;
return o == null?0:_total;
}
set
{
_total += value;
DoTotalChange();
}
}
|
Au passage, il faut éviter d'utiliser le sender pour tansmetre des valeurs. Il vaut mieux respecter les conventions. Le sender permet de transmetre la référence de l'objet éméteur de l'évènement, l'EventArgs permet lui de transmettre tou le reste.