Aller au contenu principal

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.

important

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.