Astuces DotNet (Sébastien Courtois)

15/04/2010

[Nouveautés C# .NET 4] Paramètres nommés et optionnels

Filed under: .NET, Débutant — Étiquettes : , , , , — sebastiencourtois @ 12:43

Suite de notre tour sur les nouveautés de C# 4. Après une présentation de la Co-Contravariance, nous allons nous intéresser à une fonctionnalité qui faisait cruellement défaut à .NET : les paramètres nommés / optionnels.

  • Paramètres optionnels

Qui n’a pas écrit ce type de code dans un programme :

public void MaFonction(int a)
{
  this.MaFonction(a, "toto");
}
public void MaFonction(int a, string b)
{
   this.MaFonction(a, b, null);
}
public void MaFonction(int a, string b, StringBuilder c)
{
   //Fait le traitement
}

une suite (parfois sans fin) de méthodes s’appelant les unes les autres avec des ajouts de paramètres pour arriver à “la fonction qui fait tout”. Cela a pour désavantage d’augmenter sensiblement (et inutilement) la taille du code source et cela peut être la source d’erreurs dans l’attribution des paramètres.

Pour parer à ces inconvénients, Microsoft a introduit, dans .NET 4, une nouvelle fonctionnalité : les paramètres optionnels. Il s’agit de définir des valeurs par défaut aux paramètres que l’on souhaite définir comme optionnel.

Le code précédent peut donc s’écrire en .NET 4 :

public void MaFonctionNET4(int a, string b = "Toto", StringBuilder c = null)
{
    //Fait le traitement
}

Au niveau de l’Intellisense, on se retrouve avec les affichages suivants : 

params1params2

Intellisense pour la version classique

Intellisense pour la version .NET 4

Remarque : Les paramètres optionnels doivent toujours apparaitre après les paramètres obligatoires. Ainsi le code suivant génère une erreur de compilation.

params3 
  • Paramètres nommés

Lorsque l’on a des méthodes avec beaucoup de paramètres, il arrive que l’on ne se rappelle plus de l’ordre de chacun des paramètres. Récupérer l’information par l’IntelliSense ou en allant voir dans le code source peut prendre parfois un peu de votre temps au combien précieux.

Pour pallier ce problème, .NET 4 permet d’utiliser les paramètres nommés.

Prenons une méthode classique :

public void MaFonctionNET4WithName(string param1, int param2 = 0, double param3 = -42.424242)
{

}

.NET 4 permet de définir les paramètres en fonction de leur nom et non plus en fonction de leur ordre. On peut ainsi écrire :

t.MaFonctionNET4WithName(param1: "Test",param2: 5);

Il est à noter que les paramètres nommés et les paramètres optionnels peuvent cohabiter.

Remarque : Lorsque l’on utilise les paramètres nommés pour l’appel d’une méthode, il faut le faire sur l’ensemble des paramètres il faut indiquer les paramètres nommés après les paramètres classiques (qui, eux, doivent être dans l’ordre)  . Dans le cas contraire,on récupère l’exception suivante. Dans le cas contraire,on récupère l’exception suivantes.

params4 

En revanche, l’exemple suivant est valide :

  t.MaFonctionNET4WithName("Toto", param3: 34.45, param2: 8); // Fonctionne car les paramètres non nommés sont en premiers

  • Conclusion

J’attendais cette fonctionnalité depuis un moment (surtout parce que je l’avais déjà utilisé dans d’autres langages). Il faut avouer que c’est une fonctionnalité simple,rapide à mettre en place et qui apporte une meilleur lisibilité et stabilité au code produit.

Merci à François Guillot pour avoir détecté l’erreur concernant l’ordre des paramètres.

2 commentaires »

  1. « Lorsque l’on utilise les paramètres nommés pour l’appel d’une méthode, il faut le faire sur l’ensemble des paramètres. »

    Faux, comme le montre d’ailleurs le message de l’exception. Les paramètres nommés doivent être placés APRÈS ceux non nommés, qui doivent être – forcément – dans l’ordre normal.

    Donc on peut tout à fait avoir :
    MaFonctionNET4WithName(« Toto », param3: 34.45, param2: 8);

    Commentaire par François G. — 16/04/2010 @ 16:51

  2. Merci pour la remarque, j’avais complètement zappé cette possibilité.

    L’article a été corrigé en conséquence.

    Commentaire par sebastiencourtois — 16/04/2010 @ 17:13


RSS feed for comments on this post. TrackBack URI

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

Créez un site Web ou un blog gratuitement sur WordPress.com.

%d blogueurs aiment cette page :