Comment déclarer et utiliser des propriétés en lecture-écriture (Guide de programmation C#)

Les propriétés offrent la commodité des membres de données publics sans les risques liés à un accès non protégé, non contrôlé et non vérifié aux données d’un objet. Les propriétés déclarent des accesseurs : lesquels sont des méthodes spéciales qui affectent et récupèrent des valeurs du membre de données sous-jacent. L’accesseur set permet aux membres de données d’être affectés, et l’accesseur get récupère des valeurs de membres de données.

L’exemple suivant montre une classe Person qui possède deux propriétés : Name (string) et Age (int). Étant donné que les deux propriétés fournissent des accesseurs get et set, elles sont considérées comme des propriétés en lecture/écriture.

Exemple

class Person
{
    private string _name = "N/A";
    private int _age = 0;

    // Declare a Name property of type string:
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }

    // Declare an Age property of type int:
    public int Age
    {
        get
        {
            return _age;
        }

        set
        {
            _age = value;
        }
    }

    public override string ToString()
    {
        return "Name = " + Name + ", Age = " + Age;
    }
}

public class Wrapper
{
    private string _name = "N/A";
    public string Name
    {
        get
        {
            return _name;
        }
        private set
        {
            _name = value;
        }
    }

}

class TestPerson
{
    static void Main()
    {
        // Create a new Person object:
        Person person = new Person();

        // Print out the name and the age associated with the person:
        Console.WriteLine("Person details - {0}", person);

        // Set some values on the person object:
        person.Name = "Joe";
        person.Age = 99;
        Console.WriteLine("Person details - {0}", person);

        // Increment the Age property:
        person.Age += 1;
        Console.WriteLine("Person details - {0}", person);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    Person details - Name = N/A, Age = 0
    Person details - Name = Joe, Age = 99
    Person details - Name = Joe, Age = 100
*/

Programmation fiable

Dans l’exemple précédent, les propriétés Name et Age sont publiques, et incluent un accesseur get et un accesseur set. Les accesseurs publics permettent à n’importe quel objet de lire et d’écrire ces propriétés. Toutefois, il est parfois souhaitable d’exclure l’un des accesseurs. Vous pouvez omettre l’accesseur set pour rendre la propriété en lecture seule :

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

Vous pouvez également exposer publiquement un accesseur mais rendre l’autre private ou protected. Pour plus d’informations, consultez Accessibilité de l’accesseur asymétrique.

Une fois les propriétés déclarées, vous pouvez les utiliser comme champs de la classe. Les propriétés permettent une syntaxe naturelle pour obtenir ou définir la valeur d’une propriété, comme dans les instructions suivantes :

person.Name = "Joe";
person.Age = 99;

Une variable value spéciale est disponible dans la méthode set d’une propriété. Cette variable contient la valeur que l’utilisateur a spécifiée, par exemple :

_name = value;

Notez la syntaxe correcte pour incrémenter la propriété Age sur un objet Person :

person.Age += 1;

Si des méthodes set et get distinctes ont été utilisées pour modeler des propriétés, le code équivalent peut avoir la forme suivante :

person.SetAge(person.GetAge() + 1);

La méthode ToString est substituée dans cet exemple :

public override string ToString()
{
    return "Name = " + Name + ", Age = " + Age;
}

Vous pouvez remarquer que ToString n’est pas utilisée de façon explicite dans le programme. Elle est appelée par défaut par les appels WriteLine.

Voir aussi