2-4 Propriétés non nullable et leur initialisation
Comme mentionné dans le bloc précédent, le modèle Evenement
suivant est générateur de plusieurs avertissements:
public class Evenement
{
public string Nom;
public string Description;
public string ImagePath;
public DateTime Date;
public Decimal Prix;
public int Capacite;
public string Ville;
}
[CS8618] Non-nullable field 'nom' must contain a non-null value when exiting constructor. Consider declaring the field as nullable.
Ce que le compilateur essaie de nous dire
Même si nous n'avons pas de constructeur dans le modèle, il y en a tout de même un implicite.
En effet, l'objet est tout de même initialisé via un constructeur et le résultat est que les différentes propriétés seront possiblement null
.
C'est pour cela qu'il s'agit d'avertissements, le compilateur nous indique qu'il existe une possibilité que des propriétés soient null
alors qu'on ne s'y attend peut-être pas.
Ceci dit, de notre côté, nous savons ce qui peut être null
et ce qui ne doit pas l'être. Nous pouvons l'indiquer au compilateur.
Propriétés nullable
Imaginons que Description
et ImagePath
soient des propriétés optionnelles. Nous pouvons indiquer au compilateur que nous acceptons les valeurs nulles pour ces deux propriétés en utilisant le ?
après le type:
public class Evenement
{
public string Nom;
public string? Description;
public string? ImagePath;
public DateTime Date;
public Decimal Prix;
public int Capacite;
public string Ville;
}
Supprimer l'avertissement à l'aide de null!
Pour les autres propriétés, qui nous savons ne seront pas null, il est possible de les initialiser de la façon suivante:
public class Evenement
{
public string Nom = null!;
public string? Description;
public string? ImagePath;
public DateTime Date;
public Decimal Prix;
public int Capacite;
public string Ville = null!;
}
L'initialisation avec null!
dit essentiellement au compilateur: merci de l'avertissement, mais je sais ce que je fais! Je m'arrangerai pour qu'elle ne soit pas nulle!
C'est une approche OK, mais plus un tour de passe-passe pour faire taire le compilateur.
Propriétés requises
Tous frais sortis du four dans C# 11, les propriétés requises required
sont une meilleure option dans bien des cas que l'initialisation via null!
:
public class Evenement
{
public required string Nom;
public string? Description;
public string? ImagePath;
public DateTime Date;
public Decimal Prix;
public int Capacite;
public required string Ville;
}
Pour pouvoir créer l'objet, il faut obligatoirement que les propriétés required
aient des valeurs. Une valeur de null
pour une des propriétés entrainera une erreur.
required
est l'approche avec laquelle nous partirons.
int, Decimal, DateTime, ...
Peut-être vous demandez-vous pourquoi les autres propriétés ne posent pas problème. Bonne question! 😉
int
, Decimal
et DateTime
ont des valeurs par défaut. Le null
n'est pas un enjeu pour ces propriétés.