Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le readonly mot clé est un modificateur qui peut être utilisé dans cinq contextes :
Dans une déclaration de champ,
readonlyindique que l’affectation au champ ne peut se produire que dans le cadre de la déclaration ou dans un constructeur dans la même classe. Un champ en lecture seule peut être affecté et réaffecté plusieurs fois dans la déclaration de champ et le constructeur.Un
readonlychamp ne peut pas être affecté après la sortie du constructeur. Cette règle a des implications différentes pour les types valeur et les types de référence :- Étant donné que les types valeur contiennent directement leurs données, un champ qui est un
readonlytype valeur est immuable. - Étant donné que les types de référence contiennent une référence à leurs données, un champ qui est un
readonlytype référence doit toujours faire référence au même objet. Cet objet peut ne pas être immuable. Lereadonlymodificateur empêche le remplacement de la valeur de champ par une autre instance du type de référence. Toutefois, le modificateur n’empêche pas la modification des données d’instance du champ via le champ en lecture seule.
Avertissement
Un type visible en externe qui contient un champ en lecture seule visible externe qui est un type de référence mutable peut être une vulnérabilité de sécurité et peut déclencher l’avertissement CA2104 : « Ne déclarez pas les types de référence mutables en lecture seule ».
- Étant donné que les types valeur contiennent directement leurs données, un champ qui est un
Dans une
readonly structdéfinition de type,readonlyindique que le type de structure est immuable. Pour plus d’informations, consultez lareadonlysection struct de l’article Types de structure .Dans une déclaration de membre d’instance dans un type de structure,
readonlyindique qu’un membre d’instance ne modifie pas l’état de la structure. Pour plus d’informations, consultez la section membres de l’instancereadonlyde l’article Types de structure.Dans
ref readonlyun retour de méthode, le modificateurreadonlyindique que la méthode retourne une référence et que les écritures vers cette référence ne sont pas autorisées.- Pour déclarer un
ref readonlyparamètre à une méthode.
- Pour déclarer un
Exemple de champ en lecture seule
Dans cet exemple, la valeur du champ year ne peut pas être modifiée dans la méthode ChangeYear, même si elle a été affectée à une valeur dans le constructeur de classe :
class Age
{
private readonly int _year;
Age(int year)
{
_year = year;
}
void ChangeYear()
{
//_year = 1967; // Compile error if uncommented.
}
}
Vous pouvez affecter une valeur à un readonly champ uniquement dans les contextes suivants :
Lorsque la variable est initialisée dans la déclaration, par exemple :
public readonly int y = 5;Dans un constructeur d’instance de la classe qui contient la déclaration de champ d’instance.
Dans le constructeur statique de la classe qui contient la déclaration de champ statique.
Ces contextes de constructeur sont également les seuls contextes dans lesquels il est valide de passer un readonly champ en tant que paramètre out ou ref .
Remarque
Le readonly mot clé est différent du mot clé const . Un const champ ne peut être initialisé qu’à la déclaration du champ. Un readonly champ peut être attribué plusieurs fois dans la déclaration de champ et dans n’importe quel constructeur. Par conséquent, readonly les champs peuvent avoir des valeurs différentes en fonction du constructeur utilisé. En outre, alors qu’un const champ est une constante au moment de la compilation, le readonly champ peut être utilisé pour les constantes d’exécution comme dans l’exemple suivant :
public static readonly uint timeStamp = (uint)DateTime.Now.Ticks;
public class SamplePoint
{
public int x;
// Initialize a readonly field
public readonly int y = 25;
public readonly int z;
public SamplePoint()
{
// Initialize a readonly instance field
z = 24;
}
public SamplePoint(int p1, int p2, int p3)
{
x = p1;
y = p2;
z = p3;
}
public static void Main()
{
SamplePoint p1 = new SamplePoint(11, 21, 32); // OK
Console.WriteLine($"p1: x={p1.x}, y={p1.y}, z={p1.z}");
SamplePoint p2 = new SamplePoint();
p2.x = 55; // OK
Console.WriteLine($"p2: x={p2.x}, y={p2.y}, z={p2.z}");
}
/*
Output:
p1: x=11, y=21, z=32
p2: x=55, y=25, z=24
*/
}
Dans l’exemple précédent, si vous utilisez une instruction comme l’exemple suivant :
p2.y = 66; // Error
vous obtenez le message d’erreur du compilateur :
Un champ en lecture seule ne peut pas être affecté à (sauf dans un constructeur ou un initialiseur de variable)
Membres d'instance en lecture seule
Vous pouvez également utiliser le modificateur readonly pour déclarer qu’un membre d’instance ne modifie pas l’état d’une struct.
public readonly double Sum()
{
return X + Y;
}
Remarque
Dans le cas d’une propriété en lecture/écriture, vous pouvez ajouter le readonly modificateur à l’accesseur get . Certains get accesseurs peuvent effectuer un calcul et mettre en cache le résultat, plutôt que simplement retourner la valeur d’un champ privé. L’ajout du readonly modificateur au get accesseur garantit que l’accesseur get ne modifie pas l’état interne de l’objet par mise en cache de tout résultat.
Vous trouverez d’autres exemples dans la section membres de l’instancereadonly de l’article Types de structure.
Exemple de retour en lecture seule ref
Le readonly modificateur sur un ref return indique que la référence retournée ne peut pas être modifiée. L’exemple suivant retourne une référence à l’origine. Il utilise le readonly modificateur pour indiquer que les appelants ne peuvent pas modifier l’origine :
private static readonly SamplePoint s_origin = new SamplePoint(0, 0, 0);
public static ref readonly SamplePoint Origin => ref s_origin;
Le type retourné n’a pas besoin d’être un readonly struct. Tout type pouvant être retourné par ref peut être retourné par ref readonly.
Exemple de retour en lecture seule ref readonly
Un ref readonly return peut également être utilisé avec des membres d’instance readonly sur des types struct :
public struct ReadonlyRefReadonlyExample
{
private int _data;
public readonly ref readonly int ReadonlyRefReadonly(ref int reference)
{
// _data = 1; // Compile error if uncommented.
return ref reference;
}
}
La méthode retourne essentiellement une readonly référence avec le membre de l’instance (dans ce cas, une méthode) étant readonly (impossible de modifier les champs d’instance).
Spécification du langage C#
Pour plus d'informations, voir la spécification du langage C#. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.