Codingly

Une astuce volée à Jon Skeet

Posted in Posts by Romain Verdier on juin 18, 2008

Si certains d’entre vous trouvent pénible le fait de devoir s’assurer qu’un évènement est non null avant de le lancer, voici une idée :

Profitez de la contravariance sur les delegates et initialisez votre event de la sorte :

public event MyEventHandler MyEvent = delegate{};

Ca vous permettra d’être sûr qu’il y a au moins un handler lorsque vous voudrez déclencher MyEvent, et vous n’aurez donc plus besoin d’écrire par exemple :

if(MyEvent != null)
{
    MyEvent(this, new MyEventHandler(someParam));
}

Vous pourrez directement lancer l’événement sans tester :

MyEvent(this, new MyEventHandler(someParam));

Notez que le handler (inutile) ajouté via le variable initializer à l’event ne pourra plus être retiré, ce qui peut ici être vu comme une sécurité. Cependant, l’avantage de cette astuce est à relativiser :

  • Il y a un coût (négligeable la plupart du temps) au niveau des performances.
  • Il est parfois plus judicieux d’écrire une méthode chargée d’encapsuler le test de non nullité, et qui pourra souvent être invoquée plus simplement que l’événement lui-même.

Par exemple :

private void FirePropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

A l’appel, on se retrouve avec :

FirePropertyChanged("Firstname");

Contre :

PropertyChanged(this, new PropertyChangedEventArgs("Firstname"));

Source : C# in Depth: What you need to master C# 2 and 3, de Jon Skeet.

Tagged with: , ,

4 Réponses

Subscribe to comments with RSS.

  1. Michael said, on juin 18, 2008 at 11:51

    Qu’est-ce qui a le coût le plus important: un test de nullité comme avec la fonction ou l’exécution d’un delegate vide?

    J’imagine que ça doit être à peu près similaire, et dans ce cas je préfère utiliser la fonction, qui comme tu le dis rend le code plus concis.

  2. Romain Verdier said, on juin 18, 2008 at 12:33

    Le test est moins coûteux qu’une invocation de delegate, mais on parle là d’une différence de l’ordre de la dizaine de nanosecondes… Autant oublier cet aspect, et se concentrer sur ce qui compte : lisibilité, concision, évolutivité, etc.

    Je pense que l’astuce peut-être utilisée lorsqu’un event n’est déclenché qu’à partir d’une seule méthode de la classe.

  3. grozeille said, on juin 18, 2008 at 7:51

    !!!! sympa :) Je me fais souvent ch*** à faire le test de nullité car j’ai la flemme de faire la méthode « FirePropertyChanged » (et je duplique d’autres choses).

  4. Michael said, on juin 19, 2008 at 7:31

    J’imagine bien que la différence est insignifiante :) Et comme je l’ai dit, quitte à se concentrer sur la lisibilité & co, je maintiens mon opinion sur la fonction.

    Mais comme tu dis, pas besoin de s’embêter à créer une nouvelle fonction s’il n’y a qu’un seul appel, et autant utiliser alors cette astuce.

    Sinon je me l’achèterais bien ce bouquin, j’avais déjà hésité il y a quelques temps…


Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :