C# 6 : Le nouvel opérateur “Null Propagation”

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();
    }
  }
}