En C#, le littéral null sert à indiquer l'absence de valeur. Un type nullable est un type qui autorise les valeurs null.
Avant C# 8.0, les types de référence étaient toujours nullables et les types valeur ne l'étaient pas. On peut rendre un type valeur nullable en lui ajoutant un point d'interrogation (?).
string nullableReferenceType = "hello";
nullableReferenceType = null; // Valid as type is nullable
int nonNullableValueType = 5;
nonNullableValueType = null; // Compile error as type is not nullable
int? nullableValueType = 5; // Define nullable value type
nullableValueType = null; // Valid as type is nullable
Accéder au membre d'une variable nulle ne provoque pas d'erreur de compilation, mais entraîne le déclenchement d'une NullReferenceException à l'exécution :
string sentence = null;
// Throws NullReferenceException at runtime
sentence.Length;
Pour contrer ce type d'erreur courant, C# 8 permet d'activer une fonctionnalité qui rend les types de référence non nullables par défaut :
string nonNullableReferenceType = "book";
nonNullableReferenceType = null; // Compile warning (no error!)
string? nullableReferenceType = "movie";
nullableReferenceType = null; // Valid as type is nullable
Pour manipuler des valeurs nullables en toute sécurité, on vérifie si elles sont null avant de les utiliser :
string NormalizedName(string? name)
{
if (name == null)
{
return "UNKNOWN";
}
// Value is not null at this point, so no compile warning
// and no runtime NullReferenceException being thrown
return name.ToUpper();
}
NormalizedName(null); // => "UNKNOWN"
NormalizedName("Elisabeth"); // => "ELISABETH"
L'opérateur ?? permet de renvoyer une valeur par défaut lorsque la valeur est null :
string? name1 = "John";
name1 ?? "Paul"; // => "John"
string? name2 = null;
name2 ?? "George"; // => "George"
L'opérateur ?. permet d'appeler des membres en toute sécurité sur une valeur qui peut être null :
string? fruit = "apple";
fruit?.Length; // => 5
string? vegetable = null;
vegetable?.Length; // => null
Dans cet exercice, tu vas écrire du code pour imprimer des badges nominatifs destinés aux employés d'une usine.
Les employés ont un identifiant, un nom et un nom de service. Les libellés de badge des employés sont formatés comme suit : "[id] - name - DEPARTMENT". Implémente la méthode (static) Badge.Print() pour renvoyer le libellé de badge d'un employé :
Badge.Print(734, "Ernest Johnny Payne", "Strategic Communication");
// => "[734] - Ernest Johnny Payne - STRATEGIC COMMUNICATION"
Note que le nom du service doit être en majuscules sur le libellé.
En raison d'une bizarrerie du système informatique, il arrive parfois que les nouveaux employés n'aient pas encore d'identifiant lorsqu'ils commencent à travailler à l'usine. Comme les badges sont obligatoires, ils recevront un badge temporaire sans le préfixe d'identifiant. Modifie la méthode (static) Badge.Print() pour prendre en charge les nouveaux employés qui n'ont pas encore d'identifiant :
Badge.Print(id: null, "Jane Johnson", "Procurement");
// => "Jane Johnson - PROCUREMENT"
Même le propriétaire de l'usine doit porter un badge en permanence. Cependant, un propriétaire n'a pas de service. Dans ce cas, le libellé doit afficher "OWNER" au lieu du nom du service. Modifie la méthode (static) Badge.Print() pour afficher un libellé pour le propriétaire :
Badge.Print(254, "Charlotte Hale", department: null);
// => "[254] - Charlotte Hale - OWNER"
Note qu'il est possible que le propriétaire soit aussi un nouvel employé :
Badge.Print(id: null, "Charlotte Hale", department: null);
// => "Charlotte Hale - OWNER"
Inscris-toi sur Exercism pour apprendre et maîtriser C# avec 62 concepts178 exercices, et un vrai mentorat humain, le tout gratuitement.