C# 6 apporte une nouveauté non négligeable pour clarifier le code concernant l'accès à une propriété d'un objet susceptible d'être vide.
Dans un cas classique, il est nécessaire de vérifier qu'un objet est null ou non avant d'accéder à l'une de ses propriétés sous peine de soulever une exception du type System.NullReferenceException.
Supposons qu'un utilisateur peut appartenir ou non à un groupe, nous écririons le code ci dessous pour afficher son nom en toute sécurité :
var nameGroup = user.Group != null ? user.Group.Name : "";
Avec C# 6, l'écriture est simplifiée puisque qu'il suffira simplement d'utiliser l'opérateur "?." pour ce même test :
var nameGroup = user.Group?.Name;
Un exemple complet :
using System; namespace NullPropagationOperator { public class User { public string LastName { get; set; } public string FirstName { get; set; } public Group Group { get; set; } } public class Group { public string Name { get; set; } } class Program { static void Main(string[] args) { var group1 = new Group { Name = "Groupe 1" }; var user1 = new User() { FirstName = "Kévin", LastName = "Germain", Group = group1 }; var user2 = new User() { FirstName = "Cyril", LastName = "Fra" }; Console.WriteLine("Nom du Groupe (utilisateur 1) : " + user1.Group?.Name); Console.WriteLine("Nom du Groupe (utilisateur 2) " + user2.Group?.Name); Console.ReadKey(); } } }
La décompilation de ce code montre que le compilateur va effectuer la vérification pour nous :
using System; namespace NullPropagationOperator { internal class Program { public Program() { base.\u002Ector(); } private static void Main(string[] args) { Group group1 = new Group(); string str1 = "Groupe 1"; group1.Name = str1; Group group2 = group1; User user1 = new User(); string str2 = "Kévin"; user1.FirstName = str2; string str3 = "Germain"; user1.LastName = str3; Group group3 = group2; user1.Group = group3; User user2 = user1; User user3 = new User(); string str4 = "Cyril"; user3.FirstName = str4; string str5 = "Fra"; user3.LastName = str5; User user4 = user3; string str6 = "Nom du Groupe (utilisateur 1) : "; Group group4 = user2.Group; string str7 = group4 != null ? group4.Name : (string) null; Console.WriteLine(str6 + str7); string str8 = "Nom du Groupe (utilisateur 2) "; Group group5 = user4.Group; string str9 = group5 != null ? group5.Name : (string) null; Console.WriteLine(str8 + str9); Console.ReadKey(); } } }