Les nouveautés de C# 6 (1) : les auto-propriétés

La prochaine version du langage C# est sur le point d’arriver, et devrait être disponible publiquement sous peu. En effet, la CTP 3 de Visual Studio 14 a été mise à disposition de la communauté le 18 aout 2014 et vient accompagnée d’un tas de trucs chouettes comme le nouveau compilateur Roslyn et ASP.NET vNext. Les langages en profitent, eux aussi, pour évoluer. Voici un état des lieux des nouveautés de C# 6. Parmi celles-ci, certaines sont déjà implémentées dans la CTP3, mais d’autres ne le seront que plus tard. Dans cette série d’articles, nous allons suivre les exemples fournis par Mads Torgersen, le créateur du langage.
Amélioration des auto-propriétés
Initialisation
Avec C# 5, il fallait d’abord déclarer une auto-propriété avant de pouvoir l’initialiser :
public class Customer { public string First { get; set; } public string Last { get; set; } public Customer() { First = "Jane"; Last = "Doe"; } }
Il sera dorénavant possible d’initialiser une auto-propriété comme n’importe quelle variable :
public class Customer { public string First { get; set; } = "Jane"; public string Last { get; set; } = "Doe"; }
En coulisses, l’initialisation utilise directement la variable privée implicite et non pas le setter. Ce qui permet l’amélioration suivante :
Auto-propriétés sans setter
Jusqu’ici, les auto-propriétés devaient nécessairement avoir un setter, même inutile. Il arrivait souvent de les déclarer avec un setter privé et de l’initialiser dans le constructeur par exemple :
public class Customer { public string First { get; private set; } public string Last { get; private set; } public Customer() { First = "Jane"; Last = "Doe"; } }
Dans C#6, le setter n’est plus obligatoire, et nous bénéficions de l’initialisation directe vue juste au-dessus :
public class Customer { public string First { get; } = "Jane"; public string Last { get; } = "Doe"; }
Le compilateur déclare en fait la variable privée implicite en lecture seule (readonly). Ce qui fait qu’elle ne peut être affectée que lors de l’initialisation, comme on vient de le voir, ou dans le constructeur :
public class Customer { public string Name { get; }; public Customer(string first, string last) { Name = first + " " + last; } }
A noter que dans la CTP3, seule l’affectation par initialisation marche. L’affectation par constructeur n’est pas encore implémentée.