Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Använd nyckelordet readonly som en modifierare i fem kontexter:
I en fältdeklaration
readonlyinnebär det att du bara kan tilldela fältet under deklarationen eller i en konstruktor i samma klass. Du kan tilldela och omtilldela ett skrivskyddat fält flera gånger i fältdeklarationen och konstruktorn.Du kan inte tilldela ett
readonlyfält när konstruktorn har slutförts. Den här regeln påverkar värdetyper och referenstyper på olika sätt:- Eftersom värdetyper direkt innehåller sina data är ett fält som är en
readonlyvärdetyp oföränderlig. - Eftersom referenstyper innehåller en referens till deras data måste ett fält som är en
readonlyreferenstyp alltid referera till samma objekt. Det objektet kanske inte är oföränderligt. Modifierarenreadonlyfö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 skrivskyddat fält som är en föränderlig referenstyp kan vara en säkerhetsrisk och kan utlösa varning CA2104 : "Deklarera inte skrivskyddade föränderliga referenstyper."
- Eftersom värdetyper direkt innehåller sina data är ett fält som är en
I en
readonly structtypdefinitionreadonlyinnebär det att strukturtypen är oföränderlig. Mer information finns ireadonlyavsnittet struct i artikeln Strukturtyper .I en instansmedlemsdeklaration inom en strukturtyp
readonlyinnebär det att en instansmedlem inte ändrar strukturens tillstånd. Mer information finns ireadonlyavsnittet instansmedlemmar i artikeln Strukturtyper .I en
ref readonlymetodreturreadonlyanger modifieraren att metoden returnerar en referens och att skrivningar inte tillåts till den referensen.- Deklarera en
ref readonlyparameter för en metod.
- Deklarera en
C#-språkreferensen dokumenterar den senaste versionen av C#-språket. Den innehåller även inledande dokumentation för funktioner i offentliga förhandsversioner för den kommande språkversionen.
Dokumentationen identifierar alla funktioner som först introducerades i de tre senaste versionerna av språket eller i aktuella offentliga förhandsversioner.
Tips/Råd
Information om när en funktion först introducerades i C# finns i artikeln om språkversionshistoriken för C#.
Skrivskyddat fältexempel
I det här exemplet kan du inte ändra värdet year för fältet i ChangeYear -metoden, även om klasskonstruktorn tilldelar ett värde till den:
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 du initierar variabeln 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 . Du kan bara initiera ett const fält i fältets deklaration. Du kan tilldela ett readonly fält 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
readonly Använd 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
För en läs-/skrivegenskap kan du lägga till readonly modifieraren i get accessorn. Vissa get användare utför en beräkning och cachelagrar resultatet i stället för att bara returnera värdet för ett privat fält. Genom att lägga till readonly modifieraren i get accessorn garanterar du att get accessorn inte ändrar objektets interna tillstånd genom att cachelagra något resultat.
Fler exempel finns i readonly avsnittet instansmedlemmar i artikeln Strukturtyper .
Exempel på readonly referensretur
En readonly modifierare 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 ref kan returneras kan också returneras av ref readonly.
Readonly ref readonly return exempel
Du kan också använda en ref readonly return 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.