Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

C# 6.0-le mot clé nameof

[new:20/02/2015]C# 6.0 continue de nous surprendre… aujourd’hui je vous présente le nouveau mot clé “nameof”…

Les littéraux

Les chaînes de caractères sont l’ennemi d’un langage fortement typé comme C#, et pourtant en de nombreuses occasions il faut passer des chaînes qui, par force, ne sont pas contrôlées. Faute d’orthographe, étourderie, refactoring, etc, tout cela peut engendrer des situations à risque où le fameux littéral ne correspond plus du tout à un nom réel dans l’application. Bogue sournois s’il en est par exemple dans un gestionnaire de PropertyChanged.

A l’ancienne

Même si pour ce cas particulier il existe depuis quelques temps une solution élégante permettant de récupérer le nom de la propriété appelante (l’attribut CallerMemberName) il n’est pas rare qu’on souhaite activer INPC depuis une autre propriété ou bien qu’on ait tout simplement besoin du nom d’une propriété ou d’une classe dans plein d’autres circonstances (sous XAML l’usage des littéraux est parfois gênant pour une programmation sure).

Donc dans un code INPC classique on trouvera quelque chose comme ça :

private Personne personne = new Personne();

public Pesonne Directeur 
{ 
	get { return personne; }
	set { 
   		personne = value;
                doChanged("Directeur");
 	     }
}

privade void doChanged(string propertyName)
{ ... INPC ... }

 

Ce qui gêne ici c’est bien entendu l’utilisation de “Directeur” sous la forme d’un littéral alors qu’il s’agit du nom d’une propriété.

Comme je le disais, dans ce cas précis l’attribut [CallerMemberName] qu’on placerait devant la définition de la chaîne dan la méthode “doChanged” règlerait avec élégance le problème.

Mais si nous supposons une propriété “NomComplet” qui doit être mise à jour à chaque fois que les propriétés “Nom “ et “Prénom” seront modifiées on retombe sur le même problème. En effet, si le “doChanged” pour “Nom” ou “Prénom” peut être automatique, il n’en va pas de même pour “NomComplet”, et il faudra dans les deux propriétés principales écrire un “doChanged(“NomComplet”)” si on veut que cette dernière soit rafraichie aussi…

Alors comment se débrouiller pour supprimer définitivement le passage d’un littéral qui pourtant représente un nom déclaré dans le code ?

nameof

Les idées les plus simples sont souvent les meilleures… Donc C# 6.0 ajoute le mot clé “nameof” qui fait exactement ce qu’on attend de lui, c’est à dire remplacer un nom ayant un sens dans le code par une chaîne de caractères qu’on peut ensuite utiliser sans prendre le risque qu’une fracture se créée entre cette chaîne et le nom interne à l’application.

Ce qui donne ceci :

doChanged(nameof(Directeur));

//Second exemple:

.... doChange(nameof(NomComplet)); ...

 

Plus de littéral bien que des chaînes sont toujours utilisées. L’une de mes hantises prend fin !

Conclusion

Encore une simplification qui ici ne permet pas seulement de gagner du temps ou d’alléger le code mais bien d’éviter de nombreux bogues généralement difficile à trouver. Merci C# 6.0 !

Stay Tuned !

blog comments powered by Disqus