Propriété

Doc Microsoft

Les propriétés (properties en anglais) permettent d'encapsuler les champs d'une classe. Elles permettent de contrôler l'accès aux champs et de les protéger.

Sans propriété, il est possible de modifier directement les champs d'une classe. Cela peut être dangereux car il est possible de modifier un champ sans vérifier les valeurs.

Voila un exemple de classe sans propriété:

public class Personne
{
    public string Nom;
    public int Age;
}

Il est possible de modifier directement les champs Nom et Age sans vérifier les valeurs.

Personne p = new Personne();
p.Nom = "Jean";
p.Age = -5;

Pour éviter cela, il est possible d'utiliser des propriétés.

public class Personne
{
    private string _nom;
    private int _age;

    public string Nom
    {
        get { return _nom; }
        set { _nom = value; }
    }

    public int Age
    {
        get { return _age; }
        set { _age = value; }
    }
}

Il est maintenant impossible de modifier directement les champs Nom et Age. Il est nécessaire de passer par les propriétés.

Personne p = new Personne();
p.Nom = "Jean"; // OK
p.Age = -5; // OK

Il est possible de modifier les propriétés pour ajouter des vérifications.

public class Personne
{
    private string _nom;
    private int _age;

    public string Nom
    {
        get { return _nom; }
        set
        {
            if (value.Length > 0)
            {
                _nom = value;
            }
        }
    }

    public int Age
    {
        get { return _age; }
        set
        {
            if (value > 0)
            {
                _age = value;
            }
        }
    }
}

Il est maintenant impossible de modifier le nom avec une chaine vide ou l'age avec une valeur négative.

Personne p = new Personne();
p.Nom = ""; // KO
p.Age = -5; // KO

Il est possible de mettre les getter et setter en private

public class Personne
{
    public string Nom { get; private set; }
    public int Age { private get; set; }
}

Il est maintenant impossible de modifier le nom en dehors de la classe. Il est également impossible de lire l'age en dehors de la classe.

Personne p = new Personne();
p.Nom = "Jean"; // KO
Console.WriteLine(p.Age); // KO

Il existe également une variante pour le set qui est init Dans ce cas, il est possible de modifier la valeur uniquement dans le constructeur.

public class Personne
{
    public string Nom { get; init; }
    public int Age { get; init; }
}

Il est maintenant impossible de modifier le nom et l'age en dehors du constructeur.

Personne p = new Personne { Nom = "Jean", Age = 25 }; // OK
p.Nom = "Jean"; // KO
p.Age = 25; // KO