Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Nyckelordet readonly
är en modifierare som kan användas i fem kontexter:
I en fältdeklaration
readonly
anger att tilldelningen till fältet endast kan ske som en del av deklarationen eller i en konstruktor i samma klass. Ett skrivskyddat fält kan tilldelas och omtilldelas flera gånger i fältdeklarationen och konstruktorn.Ett
readonly
fält kan inte tilldelas efter att konstruktorn har avslutats. Den här regeln har olika konsekvenser för värdetyper och referenstyper:- Eftersom värdetyper direkt innehåller sina data är ett fält som är en
readonly
värdetyp oföränderlig. - Eftersom referenstyper innehåller en referens till deras data måste ett fält som är en
readonly
referenstyp alltid referera till samma objekt. Det objektet kanske inte är oföränderligt. Modifierarenreadonly
förhindrar att fältvärdet ersätts med en annan instans av referenstypen. Modifieraren förhindrar dock inte att instansdata i fältet ändras via det skrivskyddade fältet.
Varning
En externt synlig typ som innehåller ett externt synligt endast läsbart fält som är en modifierbar referenstyp kan utgöra en säkerhetsrisk och kan utlösa varning CA2104: "Deklarera inte endast läsbara modifierbara referenstyper."
- Eftersom värdetyper direkt innehåller sina data är ett fält som är en
I en
readonly struct
typdefinitionreadonly
anger att strukturtypen är oföränderlig. Mer information finns ireadonly
avsnittet struct i artikeln Strukturtyper .I en instansmedlemsdeklaration inom en strukturtyp
readonly
anger att en instansmedlem inte ändrar strukturens tillstånd. Mer information finns ireadonly
avsnittet instansmedlemmar i artikeln Strukturtyper .I en
ref readonly
metodretur anger modifieraren att metoden returnerar en referens och att skrivningar inte tillåts till den referensenreadonly
.- Deklarera en
ref readonly
parameter för en metod.
- Deklarera en
Skrivskyddat fältexempel
I det här exemplet kan värdet för fältet year
inte ändras i metoden ChangeYear
, även om det tilldelades ett värde i klasskonstruktorn:
class Age
{
private readonly int _year;
Age(int year)
{
_year = year;
}
void ChangeYear()
{
//_year = 1967; // Compile error if uncommented.
}
}
Du kan endast tilldela ett värde till ett readonly
fält i följande kontexter:
När variabeln initieras i deklarationen, till exempel:
public readonly int y = 5;
I en instanskonstruktor för klassen som innehåller instansfältdeklarationen.
I den statiska konstruktorn för klassen som innehåller den statiska fältdeklarationen.
Dessa konstruktorkontexter är också de enda kontexter där det är giltigt att skicka ett readonly
fält som en out - eller ref-parameter .
Anmärkning
Nyckelordet readonly
skiljer sig från nyckelordet const . Ett const
-fält kan bara initieras vid deklarationen av fältet. Ett readonly
fält kan tilldelas flera gånger i fältdeklarationen och i valfri konstruktor. Därför kan readonly
fält ha olika värden beroende på vilken konstruktor som används. Även om ett const
fält är en kompileringskonstant, kan readonly
fältet användas för körningskonstanter som i följande exempel:
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
*/
}
I det föregående exemplet, om du använder ett uttryck som i följande exempel:
p2.y = 66; // Error
du får felmeddelandet för kompilatorn:
Det går inte att tilldela ett skrivskyddat fält till (förutom i en konstruktor eller en variabelinitierare)
Skrivskyddade instansmedlemmar
Du kan också använda readonly
modifieraren för att deklarera att en instansmedlem inte ändrar tillståndet för en struct.
public readonly double Sum()
{
return X + Y;
}
Anmärkning
När det gäller en läs-/skrivegenskap kan du lägga till readonly
modifieraren i get
accessorn. Vissa get
accessormetoder kan utföra en beräkning och cachelagra resultatet istället för att enbart returnera värdet för ett privat fält. Genom att lägga till readonly
modifieraren till get
accessorn garanteras att get
accessorn inte ändrar objektets interna tillstånd genom att cachelagra något resultat.
Du hittar fler exempel i avsnittet instansmedlemmar ireadonly
artikeln Strukturtyper.
Exempel på readonly referensretur
Modifieraren readonly
på en ref return
anger att den returnerade referensen inte kan ändras. I följande exempel returneras en referens till ursprunget. Den använder readonly
modifieraren för att indikera att anropare inte kan ändra ursprunget:
private static readonly SamplePoint s_origin = new SamplePoint(0, 0, 0);
public static ref readonly SamplePoint Origin => ref s_origin;
Den typ som returneras behöver inte vara en readonly struct
. Alla typer som kan returneras av ref
kan returneras av ref readonly
.
Readonly ref readonly return exempel
A ref readonly return
kan också användas med readonly
instansmedlemmar på struct
typer:
public struct ReadonlyRefReadonlyExample
{
private int _data;
public readonly ref readonly int ReadonlyRefReadonly(ref int reference)
{
// _data = 1; // Compile error if uncommented.
return ref reference;
}
}
Metoden returnerar i princip en readonly
referens tillsammans med instansmedlemmen (i det här fallet en metod) som readonly
(inte kan ändra några instansfält).
Språkspecifikation för C#
Mer information finns i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.
Du kan också se förslag på språkspecifikation: