ref
strukturtyper (C#-referens)
Du kan använda ref
modifieraren i deklarationen av en strukturtyp. Instanser av en ref struct
typ allokeras i stacken och kan inte fly till den hanterade heapen. För att säkerställa att kompilatorn begränsar användningen av ref struct
typer enligt följande:
- A
ref struct
kan inte vara elementtypen för en matris. - A
ref struct
kan inte vara en deklarerad typ av ett fält i en klass eller en icke-ref struct
. - Det
ref struct
går inte att implementera gränssnitt. - A
ref struct
kan inte boxas till System.ValueType eller System.Object. - Ett
ref struct
kan inte vara ett typargument. - En
ref struct
variabel kan inte avbildas i ett lambda-uttryck eller en lokal funktion. - Före C# 13
ref struct
kan variabler inte användas i enasync
metod. Från och med C# 13 kan enref struct
variabel inte användas i samma block somawait
uttrycket i enasync
metod. Du kan dock användaref struct
variabler i synkrona metoder, till exempel i metoder som returnerar Task eller Task<TResult>. - Före C# 13 kan en
ref struct
variabel inte användas i iteratorer. Från och med C# 13ref struct
kan typer ochref
lokalbefolkningen användas i iteratorer, förutsatt att de inte finns i kodsegment med -instruktionenyield return
.
Du kan definiera en disponibel ref struct
. För att göra det, se till att ett ref struct
passar disponibelt mönster. Den har alltså en instansmetod Dispose
som är tillgänglig, parameterlös och har en void
returtyp. Du kan använda instruktionen eller deklarationen med en instans av en disponibel ref struct
.
Vanligtvis definierar du en ref struct
typ när du behöver en typ som även innehåller datamedlemmar av ref struct
typer:
public ref struct CustomRef
{
public bool IsValid;
public Span<int> Inputs;
public Span<int> Outputs;
}
Om du vill deklarera en ref struct
som kombinerar readonly
du och ref
modifierarna i typdeklarationen (readonly
modifieraren måste komma före ref
modifierarenreadonly
):
public readonly ref struct ConversionRequest
{
public ConversionRequest(double rate, ReadOnlySpan<double> values)
{
Rate = rate;
Values = values;
}
public double Rate { get; }
public ReadOnlySpan<double> Values { get; }
}
I .NET är System.Span<T> System.ReadOnlySpan<T>och ref struct
.
ref
Fält
Från och med C# 11 kan du deklarera ett ref
fält i ett ref struct
, som följande exempel visar:
public ref struct RefFieldExample
{
private ref int number;
public int GetNumber()
{
if (System.Runtime.CompilerServices.Unsafe.IsNullRef(ref number))
{
throw new InvalidOperationException("The number ref field is not initialized.");
}
return number;
}
}
Ett ref
fält kan ha värdet null
. Unsafe.IsNullRef<T>(T) Använd metoden för att avgöra om ett ref
fält är null
.
Du kan tillämpa readonly
modifieraren på ett ref
fält på följande sätt:
readonly ref
: Du kan återtilldela ett sådant fält med operatorn= ref
endast inuti en konstruktor eller eninit
accessor. Du kan tilldela ett värde med operatorn=
när som helst som tillåts av fältåtkomstmodifieraren.ref readonly
: Du kan när som helst inte tilldela ett värde med operatorn=
till ett sådant fält. Du kan dock återtilldela ett fält med operatorn= ref
.readonly ref readonly
: Du kan bara återtilldela ett sådant fält i en konstruktor eller eninit
accessor. När som helst kan du inte tilldela ett värde till fältet.
Kompilatorn ser till att en referens som lagras i ett ref
fält inte överlever sina referenser.
Funktionen ref
fält möjliggör en säker implementering av typer som System.Span<T>:
public readonly ref struct Span<T>
{
internal readonly ref T _reference;
private readonly int _length;
// Omitted for brevity...
}
Typen Span<T>
lagrar en referens genom vilken den kommer åt sammanhängande element i minnet. Med hjälp av en referens kan en Span<T>
instans undvika att kopiera lagringen som den refererar till.
Språkspecifikation för C#
Mer information finns i följande avsnitt i C#-språkspecifikationen:
Mer information om ref
fält finns i förslag på förbättringar på låg nivå .
Se även
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för