Megosztás a következőn keresztül:


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ódusokban async . A C# 13-tól kezdődően egy ref struct változó nem használható ugyanabban a blokkban, mint egy await metódus kifejezése async . A változókat azonban szinkron metódusokban is használhatja ref 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ól ref struct kezdődően a típusok és ref a helyiek használhatók az iterátorokban, feltéve, hogy nincsenek kódszegmensekben az yield 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 a ref szerkezetek interfészeket implementálhatnak, de be kell tartaniuk a ref biztonsági szabályokat. Egy típus például ref 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 a ref struct típusargumentum lehet, ha a típusparaméter a záradékában adja meg a allows ref struct paramétert where .

Á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 readonlydeklará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 structkö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 vagy init 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 vagy init 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 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ó 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ípust ref 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 . A ref 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 structkö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.

Lásd még