Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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 structlehet tömb elemtípusa. - A
ref structmező nem lehet osztály vagy nemref structdeklarált típusa. - A
ref structnem lehet bekeretezett System.ValueType vagy System.Object. - A
ref structváltozók nem rögzíthetők lambdakifejezésben vagy helyi függvényben. - A C# 13
ref structelőtt a változók nem használhatók metódusokbanasync. A C# 13-tól kezdődően egyref structváltozó nem használható ugyanabban a blokkban, mint egyawaitmetó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 structváltozó nem használható iterátorokban. A C# 13-tólref structkezdődően a típusok ésrefa helyiek használhatók az iterátorokban, feltéve, hogy nincsenek kódszegmensekben azyield returnutasítással. - A C# 13
ref structelőtt nem lehet interfészeket implementálni. A C# 13-tól kezdődően arefszerkezetek interfészeket implementálhatnak, de be kell tartaniuk a ref biztonsági szabályokat. Egy típus példáulref structnem konvertálható illesztőtípussá, mert ehhez boxing átalakításra van szükség. - A C# 13
ref structelőtt nem lehet típusargumentum. A C# 13-tól kezdődően aref structtípusargumentum lehet, ha a típusparaméter a záradékában adja meg aallows ref structparamé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 ref structdeklarálásához readonly 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
Egy mező deklarálható ref a ref structkövetkező példában látható módon:
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 vagy belül rendelheti= refaz operátorhozinit. 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= refoperátorral. -
readonly ref readonly: Ilyen mezőt csak konstruktorban vagyinittartozé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 elérhető, paraméter nélküli és visszatérési típusú példánymetódussal Dispose rendelkezik void . A használati utasítást vagy deklarációt használhatja egy eldobható ref structpé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ó csak akkor oldja fel a IDisposable.Dispose metódust, ha nem található megfelelő Dispose metódus.
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 structrendszer 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 structhaszná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. Aref structexplicit felületi deklarációkként deklarálhatnak metódusokat. Ezek a metódusok azonban csak olyan általános metódusokból érhetők el, ahol a típusparaméterallows ref structtípusok. - A felületi megvalósító
ref structkell implementálnia az összes példányillesztő-tagot. Aref structakkor is implementálnia kell a példánytagokat, ha 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 ad implementációt az új példány metódusaihoz, az alkalmazás nem fordítja le. Az alapértelmezett implementációval rendelkező static interfészmetódushoz nem adhat meg konkrét implementációt.
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 alapértelmezett tagokat ad hozzá az adott felülethez.
A forrástörés a ref structújrafordításakor következik be: Az új tagot akkor is implementálnia kell, ha 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.