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é :
1
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 :
1
var nameGroup = user.Group?.Name;
Un exemple complet :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
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();
}
}
}