ref
struktúratípusok (C#-referencia)
A módosító egy ref
struktúratípus deklarációjában használható. Egy típuspéldányok ref struct
a veremen vannak lefoglalva, és nem tudnak menekülni a felügyelt halomhoz. Ennek biztosítása érdekében a fordító az alábbiak szerint korlátozza a típusok használatát ref struct
:
- Nem
ref struct
lehet tömb elemtípusa. - A
ref struct
mező nem lehet osztály vagy nemref struct
deklarált típusa. - A
ref struct
nem lehet bekeretezett System.ValueType vagy System.Object. - A
ref struct
változók nem rögzíthetők lambdakifejezésben vagy helyi függvényben. - A C# 13
ref struct
előtt a változók nem használhatók metódusokbanasync
. A C# 13-tól kezdődően egyref struct
változó nem használható ugyanabban a blokkban, mint egyawait
metódus kifejezéseasync
. A változókat azonban szinkron metódusokban is használhatjaref struct
, például olyan metódusokban, amelyek visszaadják Task vagy Task<TResult>. - A C# 13 előtt egy
ref struct
változó nem használható iterátorokban. A C# 13-tólref struct
kezdődően a típusok ésref
a helyiek használhatók az iterátorokban, feltéve, hogy nincsenek kódszegmensekben azyield return
utasítással. - A C# 13
ref struct
előtt nem lehet interfészeket implementálni. A C# 13-tól kezdődően aref
szerkezetek interfészeket implementálhatnak, de be kell tartaniuk a ref biztonsági szabályokat. Egy típus példáulref struct
nem konvertálható illesztőtípussá, mert ehhez boxing átalakításra van szükség. - A C# 13
ref struct
előtt nem lehet típusargumentum. A C# 13-tól kezdődően aref struct
típusargumentum lehet, ha a típusparaméter a záradékában adja meg aallows ref struct
paramétertwhere
.
Általában akkor határoz meg típust ref struct
, ha olyan típusra van szüksége, amely az adattípusokat ref struct
is tartalmazza:
public ref struct CustomRef
{
public bool IsValid;
public Span<int> Inputs;
public Span<int> Outputs;
}
As readonly
deklarálásához ref struct
egyesítse a readonly
típusdeklarációban a módosítókat és ref
a módosítókat (a readonly
módosítónak a ref
módosító előtt kell lennie):
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; }
}
A .NET-ben példákat ref struct
láthat a következőkre System.Span<T> : és System.ReadOnlySpan<T>.
ref
Mezők
A C# 11-től kezdődően deklarálhat egy ref
mezőt a ref struct
következő példában:
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;
}
}
Egy ref
mezőnek lehet null
értéke. Unsafe.IsNullRef<T>(T) A metódus használatával állapítsa meg, hogy egy ref
mező .null
A módosító a readonly
következő módokon alkalmazható egy ref
mezőre:
readonly ref
: Az ilyen mezőket csak konstruktoron vagyinit
tartozékon belül rendelheti újra az operátorhoz= ref
. A mezőhozzáférési módosító által engedélyezett bármely ponton hozzárendelhet értéket=
az operátorhoz.ref readonly
: Egy ilyen mezőhöz nem rendelhet értéket az=
operátorral. Azonban újra hozzárendelhet egy mezőt az= ref
operátorral.readonly ref readonly
: Ilyen mezőt csak konstruktorban vagyinit
tartozékban rendelhet újra. Bármikor nem rendelhet értéket a mezőhöz.
A fordító biztosítja, hogy egy mezőben tárolt ref
hivatkozás ne lépje túl a hivatkozási értékét.
A ref
mezők funkció lehetővé teszi a következő típusok System.Span<T>biztonságos implementálását:
public readonly ref struct Span<T>
{
internal readonly ref T _reference;
private readonly int _length;
// Omitted for brevity...
}
A Span<T>
típus egy hivatkozást tárol, amelyen keresztül hozzáfér a memória összefüggő elemeihez. A hivatkozás használatával a Span<T>
példányok elkerülhetik a hivatkozott tárterület másolását.
Az eldobható minta
Definiálhat egy eldobható ref struct
. Ehhez győződjön meg arról, hogy az ref struct
eldobható mintához illeszkedik. Ez azt jelent, hogy egy példánymetódussal Dispose
rendelkezik, amely elérhető, paraméter nélküli, és visszatérési típussal void
rendelkezik. A használati utasítást vagy deklarációt használhatja egy eldobható ref struct
példánysal.
A C# 13-tól kezdve a IDisposable típusokat ref struct
is implementálhatja. A túlterhelés feloldása azonban inkább az egyszer használatos mintát részesíti előnyben az interfészmetódushoz. A fordító egy IDisposable.Dispose
metódussal oldja fel, hogy csak egy megfelelő Dispose
metódus nem található.
Az interfészt ref struct
megvalósító típusok korlátozásai
Ezek a korlátozások biztosítják, hogy az ref struct
interfészt megvalósító típus betartsa a szükséges ref biztonsági szabályokat.
- A
ref struct
rendszer nem konvertálható az általa implementálandó felület példányává. Ez a korlátozás magában foglalja az implicit konverziót, amikor egy típustref struct
használ argumentumként, amikor a paraméter egy interfésztípus. Az átalakítás egy boxing konverziót eredményez, amely sérti a ref biztonságát. - Az
ref struct
illesztőt megvalósító felületnek minden illesztőtagot implementálnia kell . Aref struct
tagoknak olyan tagokat kell implementálniuk, ahol az interfész alapértelmezett implementációt tartalmaz.
A fordító kikényszeríti ezeket a korlátozásokat. Ha felületeket implementáló típusokat ír ref struct
, minden új frissítés tartalmazhat új alapértelmezett illesztőtagokat. Amíg nem biztosít implementációt ezekhez az új módszerekhez, az alkalmazás nem fog lefordítani.
Fontos
Az ref struct
interfészt megvalósító felület magában foglalja a későbbi forrástörési és bináris kompatibilitástörő változások lehetőségét. A törés akkor fordul elő, ha egy ref struct
másik szerelvényben definiált felületet implementál, és a szerelvény egy olyan frissítést biztosít, amely hozzáadja az alapértelmezett tagokat az adott felülethez.
A forrástörés a következő újrafordításakor ref struct
következik be: Az új tagnak implementálnia kell, annak ellenére, hogy van egy alapértelmezett implementáció.
A bináris törés akkor fordul elő, ha a külső szerelvényt a típus újrafordítása ref struct
nélkül frissíti, és a frissített kód az új metódus alapértelmezett implementációját hívja meg. A futtatókörnyezet kivételt jelez az alapértelmezett tag elérésekor.
C# nyelvspecifikáció
További információt a C# nyelvspecifikációjának alábbi szakaszaiban talál:
A mezőkkel kapcsolatos ref
további információkért tekintse meg az Alacsony szintű szerkezetfejlesztések javaslati megjegyzését.