ref typy struktur (referenční dokumentace jazyka C#)

Modifikátor můžete použít ref v deklaraci typu struktury. Instance typu ref struct se přidělují v zásobníku a nemůžou utéct do spravované haldy. Aby to bylo zajištěno, kompilátor omezuje použití typů ref struct následujícím způsobem:

  • A ref struct nemůže být typem prvku pole.
  • A ref struct nemůže být deklarovaným typem pole třídy nebo jinéhoref struct pole.
  • A ref struct nemůže implementovat rozhraní.
  • A ref struct nelze zaboxovat do System.ValueType nebo System.Object.
  • A ref struct nemůže být argument typu.
  • Proměnnou ref struct nelze zachytit výrazem lambda nebo místní funkcí.
  • Proměnnou ref struct nelze použít v async metodě. Proměnné však můžete použít ref struct v synchronních metodách, například v metodách, které vrací Task nebo Task<TResult>.
  • Proměnnou ref struct nelze použít v iterátorech.

Můžete definovat jednorázový ref struct. Chcete-li to provést, ujistěte se, že ref struct vyhovuje jednorázovému vzoru. To znamená, že má metodu instance Dispose , která je přístupná, bez parametrů a má návratový void typ. Můžete použít příkaz using nebo deklaraci s instancí jednorázového ref structobjektu .

Typ se obvykle definuje ref struct , když potřebujete typ, který obsahuje také datové členy typů ref struct :

public ref struct CustomRef
{
    public bool IsValid;
    public Span<int> Inputs;
    public Span<int> Outputs;
}

Pokud chcete deklarovat ref struct jako readonly, zkombinujte readonly modifikátory a ref v deklaraci typu ( readonly modifikátor musí být před modifikátorem ref ):

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; }
}

V .NET jsou System.Span<T>System.ReadOnlySpan<T>příklady a ref struct .

ref Pole

Počínaje jazykem C# 11 můžete deklarovat ref pole v objektu ref struct, jak ukazuje následující příklad:

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;
    }
}

Pole ref může mít null hodnotu. Unsafe.IsNullRef<T>(T) Pomocí metody určete, jestli ref je nullpole .

Modifikátor můžete u ref pole použít readonly následujícími způsoby:

  • readonly ref: Toto pole můžete znovu přiřadit operátorem = ref pouze uvnitř konstruktoru init nebo příslušenství. Hodnotu s operátorem = můžete přiřadit v libovolném bodě povoleném modifikátorem přístupu k polím.
  • ref readonly: V žádném okamžiku nemůžete k takovému = poli přiřadit hodnotu s operátorem. Můžete ale odkazovat na opětovné přiřazení pole pomocí operátoru = ref .
  • readonly ref readonly: Toto pole můžete znovu přiřadit pouze v konstruktoru nebo přistupovacím objektu init . V žádném okamžiku nemůžete k poli přiřadit hodnotu.

Kompilátor zajistí, aby odkaz uložený v ref poli nepřežil svůj odkaz.

Funkce ref polí umožňuje bezpečnou implementaci typů, jako je System.Span<T>:

public readonly ref struct Span<T>
{
    internal readonly ref T _reference;
    private readonly int _length;

    // Omitted for brevity...
}

Typ Span<T> ukládá odkaz, jehož prostřednictvím přistupuje k souvislým prvkům v paměti. Použití odkazu umožňuje Span<T> instanci vyhnout se kopírování úložiště, na které odkazuje.

specifikace jazyka C#

Další informace najdete v následujících částech specifikace jazyka C#:

Další informace o ref polích najdete v poznámce k návrhu vylepšení struktury nízké úrovně .

Viz také