Les propriétés.
Une propriété est une valeur qui peut être lue ou modifiée, comme une variable.
Ces deux opérations sont en fait réalisées par les accesseurs codice_1 et codice_2. Si l'un de ces deux accesseurs est manquant, la propriété sera alors soit en lecture seule, soit en écriture seule.
Syntaxe.
 "Type" "Nom_de_la_propriété"
 get // propriété lue
 "code retournant une valeur du Type spécifié"
 set // propriété modifiée
 "code utilisant le paramètre prédéfini "value""
Le code contenu dans chaque bloc est le même que celui que l'on placerait pour implémenter les méthodes suivantes :
 "Type" get"Nom_de_la_propriété"()
 "code retournant une valeur du Type spécifié"
 void set"Nom_de_la_propriété"("Type" value) // propriété modifiée
 "code utilisant le paramètre prédéfini "value""
Exemple.
private string _message;
public string Message
 get
 return _message;
 set
 _message = value;
Utilisation :
Message = "Test de la propriété" ; // <- accesseur set
Console.WriteLine( Message ); // <- accesseur get
Message += " et message ajouté"; // <- accesseurs get et set
Noms réservés.
Depuis la version 2003 du compilateur, lorsqu'une propriété est créée, deux noms de méthodes sont réservés pour les deux accesseurs :
La classe ne peut donc avoir de méthodes portant l'une de ces deux signatures.
Accesseurs simplifiés.
Une propriété en lecture seule possède un accesseur de lecture "get" mais aucun accesseur d'écriture "set", comme dans l'exemple suivant :
private string _message;
public string MessageSize
 get
 return _message.Length();
Depuis C#6.0 il est possible de simplifier la définition d'une telle propriété : le nom de la propriété est directement associé à l'expression retournée par l'accesseur de lecture en utilisant l'opérateur codice_5.
private string _message;
public string MessageSize => _message.Length();
Depuis C#7.0 il est possible d'utiliser cette syntaxe sur les accesseurs, qui est donc applicable également à une propriété en lecture et écriture, comme illustré par cet exemple :
private string _message;
public string Message
 get => _message;
 set => _message = value;
Accesseurs auto-implémentés.
Une propriété peut également avoir des accesseurs auto-implémentées :
Exemple :
public class Test
La classe n'ayant aucun constructeur explicite, l'initialisation d'un objet peut se faire en utilisant la syntaxe suivante permettant d'initialiser les propriétés :
Test test1 = new Test{ Message="Exemple de test"; };
test1.Message = "Autre test";
Accesseurs d'initialisation.
Selon les accesseurs définis pour une propriété :
Depuis C#9.0, il existe un cas intermédiaire permettant de définir une propriété qui devient en lecture seule après initialisation de l'objet, en déclarant un accesseur nommé codice_9.
Exemple :
public class Test
L'accesseur codice_9 est utilisé lors de l'initialisation de l'objet.
Test test1 = new Test{ Message="Exemple de test"; }; // <-- OK, appelle l'accesseur init
test1.Message = "Autre test"; // <-- ERREUR, pas d'accesseur set
Quand l'accesseur codice_9 est implémenté, il peut servir à initialiser des champs codice_12 de l'objet :
public class Test
 private readonly string message;
 public string Message
 get => message;
 init => message = (value ?? throw new ArgumentNullException(nameof(Message)));
 public string MessageSize
 get => message.Length();
Les indexeurs.
Un indexeur est une propriété spéciale qui permet d'utiliser une instance de la classe comme un tableau, en utilisant les crochets.
Syntaxe.
 "Type_élément" this[ "Type_index" "index" ]
 get // élément ["index"] lu
 "Code retournant une valeur du Type_éléments spécifié"
 "dont l'index est dans le paramètre index"
 set // élément ["index"] modifié
 "Code utilisant le paramètre prédéfini "value""
 "pour le stocker à l'index spécifié par le paramètre index"
L'index peut avoir un autre type que codice_16. C'est le cas des tables de hashage de l'espace de nom codice_17.
Exemple.
public class TableauVirtuel
 public string this[int index] 
 // lecture seule car pas d'accesseur set
 get
 return "Elément"+index.ToString();
TableauVirtuel tab=new TableauVirtuel();
Console.WriteLine("tab[15] = " + tab[15] );
// affiche Elément15

Programmation C sharp/Héritage de classes