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 felületeket nem lehet implementálni.
  • A ref struct nem lehet bekeretezett System.ValueType vagy System.Object.
  • Nem ref struct lehet típusargumentum.
  • A ref struct változók nem rögzíthetők lambdakifejezésben vagy helyi függvényben.
  • A C# 13ref 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.

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.

Á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.

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