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í do zásobníku a nemůžou utéct ke spravované haldě. Aby se zajistilo, kompilátor omezuje použití typů ref struct následujícím způsobem:

  • A ref struct nemůže být typem prvku pole.
  • Nelze ref struct deklarovat typ pole třídy nebo jiného typuref struct.
  • Rozhraní ref struct nelze implementovat.
  • A ref struct nemůže být v rámečku System.ValueType nebo System.Object.
  • Argument ref struct typu nemůže být.
  • Proměnnou ref struct nelze zachytit výrazem lambda ani 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 uvolnitelné ref struct. Abyste to mohli udělat, ujistěte se, že vyhovuje jednorázovému ref structvzoru. 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í uvolnitelné ref struct.

Typ definujete ref struct obvykle v případě, že potřebujete typ, který zahrnuje i datové členy typů ref struct :

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

Chcete-li deklarovat ref struct jako readonly, zkombinujte readonly a ref modifikátory 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 příklady ref struct a System.Span<T>System.ReadOnlySpan<T>.

ref Pole

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

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, zda ref je nullpole .

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

  • readonly ref: Toto pole můžete znovu přiřadit pomocí operátoru = ref pouze uvnitř konstruktoru nebo přístupového objektuinit. Hodnotu s operátorem = můžete přiřadit v libovolném bodě povoleném modifikátorem přístupu k poli.
  • ref readonly: V libovolném okamžiku nelze k takovému poli přiřadit hodnotu s = operátorem. Můžete ale znovu přiřadit pole pomocí operátoru = ref .
  • readonly ref readonly: Toto pole můžete znovu přiřadit pouze v konstruktoru nebo přístupové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 neobsáhl jeho odkaz.

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

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

    // Omitted for brevity...
}

Typ Span<T> ukládá odkaz, prostřednictvím kterého přistupuje k souvislým prvkům v paměti. Použití odkazu umožňuje Span<T> instanci zabránit 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 naleznete v návrhu vylepšení struktury nízké úrovně.

Viz také