CodeGym /Cours /C# SELF /Propriétés (Properties) en C#

Propriétés (Properties) en C#

C# SELF
Niveau 17 , Leçon 1
Disponible

1. Intro

On commence par les problèmes qui arrivent quand tu utilises les champs direct. Si tu déclares un champ comme public, il pourra être modifié direct et n’importe où dans le programme :

public class Dog
{
    public string Name;
}

Dog dog = new Dog();
dog.Name = ""; // O_o ... genre "nom du chien = chaîne vide" !

L’utilisateur peut donner à Name des valeurs complètement improbables, même des trucs qui n’ont aucun sens pour ton domaine : chaîne vide, nom trop long, ou même null. C’est comme si quelqu’un montait ton nouveau meuble IKEA et tu lui donnais accès à toute l’usine de menuiserie.

Je te rappelle que encapsulation — c’est quand l’objet contrôle ses propres données. On ne fait pas confiance à tout le monde pour toucher à l’intérieur, on file des "portes spéciales" — les propriétés (Properties), par lesquelles on accède au champ, mais avec possibilité de vérifier, logger, modifier ou réagir à la modif de la valeur.

2. Définition et syntaxe

Une propriété — c’est un membre spécial d’une classe, qui ressemble à un champ, mais en vrai c’est une paire de méthodes spéciales sous le capot : getter (pour lire la valeur) et setter (pour l’écrire). Avec une propriété, tu peux :

  • Autoriser (ou interdire) la lecture/l’écriture des données ;
  • Ajouter de la validation ou de la logique à l’accès aux données ;
  • Cacher le champ interne, ou même stocker la valeur ailleurs.

Une propriété s’annonce presque comme un champ, mais avec des accolades et les mots-clés get et set dedans.


[modificateur_acces] type NomPropriete
{
    get { ... }
    set { ... }
}
Modèle d’annonce d’une propriété

Voilà un exemple pour notre classe Dog :

public class Dog
{
    private string _name; // champ interne (private !)

    public string Name
    {
        get { return _name; }  // "getter" : lire le nom
        set { _name = value; } // "setter" : donner un nom
    }
}

Note : on met souvent un underscore pour les champs privés (_name). C’est le style standard en C#.

3. Comment ça marche une propriété

Une propriété, c’est un peu le "videur" qui se met entre les données internes de l’objet et le monde extérieur. Exemple :

Dog dog = new Dog();
dog.Name = "Buddy";
Console.WriteLine(dog.Name);

Explication :

  • Quand le programme arrive à dog.Name = "Buddy"; — là, c’est la méthode set de la propriété qui est appelée, et tu peux y mettre toutes les vérifs que tu veux (genre vérifier que le nom n’est pas vide).
  • Au moment de Console.WriteLine(dog.Name); c’est la méthode get qui est appelée, qui renvoie juste la valeur actuelle ou, si tu veux, un truc calculé à la volée.

Ça ressemble à un champ normal, mais en vrai tout est sous contrôle !

4. Pourquoi les propriétés c’est le "Best Practice"

Dans la plupart des cas, on ne donne pas d’accès direct aux champs internes d’un objet. Même si tu penses que t’as pas besoin de vérif maintenant, prendre l’habitude de tout passer par des propriétés te sauvera la vie quand les règles changeront.

Exemple de "validation" à l’affectation :


public class Dog
{
    private string _name;

    public string Name
    {
        get { return _name; }
        set
        {
            if (string.IsNullOrWhiteSpace(value))
            {
                throw new ArgumentException("Le nom du chien ne peut pas être vide !");
            }
            _name = value;
        }
    }
}

Maintenant, ce truc-là :

dog.Name = ""; // Va lancer une exception !

… protège notre objet contre les valeurs absurdes.

5. Propriétés : lecture seule, écriture seule et classiques

Parfois tu veux juste permettre de lire la valeur (genre l’année de naissance du chien, tu la changes pas), ou au contraire — juste écrire (rare, mais si tu veux faire un truc chelou).

  • Lecture seule : tu mets juste get, tu vires set.
  • Écriture seule : tu mets juste set, tu vires get.

Exemples :

public class Dog
{
    private int _birthYear = 2018;

    // Lecture seule
    public int BirthYear
    {
        get { return _birthYear; }
    }

    // Écriture seule (très rare)
    public string Secret
    {
        set { /* on fait un truc avec value */ }
    }
}

6. Propriétés vs champs

Champ Propriété
Syntaxe
public string Name;
public string Name { get; set; }
Accès Direct Via get/set
Validation Non Tu peux en mettre dans set/get
Extensible Non Tu peux modifier quand tu veux
Intégration IDE Vu comme champ Vu comme propriété (important pour les frameworks)

Illustration : Comment marche une propriété

sequenceDiagram
participant User as Utilisateur de l’objet
participant Dog as Objet Dog
participant Field as Champ privé _name

User->>Dog: dog.Name = "Ginger"
Dog->>Dog: set Name("Ginger")
Dog->>Field: _name = "Ginger"

User->>Dog: print(dog.Name)
Dog->>Dog: get Name()
Dog->>Field: lit _name
Dog->>User: renvoie "Ginger"

7. Erreurs classiques et subtilités

Voyons où tu peux te faire piéger.

Erreur fréquente — confondre champs et propriétés, et exposer sans faire exprès des données privées :

public string name; // C’est un champ ! Visible partout, dangereux !

Mieux comme ça :

private string _name;
public string Name
{
    get { return _name; }
    set { _name = value; }
}

Propriétés statiques existent aussi, pour stocker des valeurs communes à tous les objets. Mais fais gaffe avec ça.

Fun fact : si une propriété n’a que get et aucun constructeur, tu peux jamais la modifier — ça s’appelle une immutable property et c’est super utilisé dans les designs modernes (on en reparlera dans les confs sur record et l’immutabilité des données).

2
Mission
C# SELF, niveau 17, leçon 1
Bloqué
Déclaration d'une propriété avec accès get et set
Déclaration d'une propriété avec accès get et set
2
Mission
C# SELF, niveau 17, leçon 1
Bloqué
Propriété avec validation des données d'entrée
Propriété avec validation des données d'entrée
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION