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
.