ref structuurtypen (C#-verwijzing)

U kunt de ref wijzigingsfunctie gebruiken in de declaratie van een structuurtype. Exemplaren van een ref struct type worden toegewezen aan de stack en kunnen niet ontsnappen aan de beheerde heap. Om ervoor te zorgen dat de compiler het gebruik van ref struct typen als volgt beperkt:

  • Een ref struct kan niet het elementtype van een matrix zijn.
  • Een ref struct kan geen gedeclareerd type van een veld van een klasse of een niet-ref struct.
  • Een ref struct kan geen interfaces implementeren.
  • Een ref struct kan niet worden geboksd aan System.ValueType of System.Object.
  • Een ref struct kan geen typeargument zijn.
  • Een ref struct variabele kan niet worden vastgelegd door een lambda-expressie of een lokale functie.
  • Een ref struct variabele kan niet worden gebruikt in een async methode. U kunt echter variabelen gebruiken ref struct in synchrone methoden, bijvoorbeeld in methoden die retourneren Task of Task<TResult>.
  • Een ref struct variabele kan niet worden gebruikt in iterators.

U kunt een wegwerp ref structdefiniëren. Om dat te doen, moet u ervoor zorgen dat een ref struct past bij het wegwerppatroon. Dat wil gezegd, het heeft een exemplaarmethode Dispose , die toegankelijk, parameterloos is en een void retourtype heeft. U kunt de using-instructie of declaratie gebruiken met een exemplaar van een wegwerp.ref struct

Normaal gesproken definieert u een ref struct type wanneer u een type nodig hebt dat ook gegevensleden van ref struct typen bevat:

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

Als u een als readonlywilt ref struct declareren, combineert u de readonly en ref modifiers in de typedeclaratie (de readonly modifier moet vóór de ref wijzigingsfunctie komen):

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

In .NET zijn System.Span<T>System.ReadOnlySpan<T>en ref struct .

ref Velden

Vanaf C# 11 kunt u een ref veld in een ref structdeclareren, zoals in het volgende voorbeeld wordt weergegeven:

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

Een ref veld kan de null waarde hebben. Gebruik de Unsafe.IsNullRef<T>(T) methode om te bepalen of een ref veld is null.

U kunt de readonly wijzigingsfunctie op een ref veld op de volgende manieren toepassen:

  • readonly ref: U kunt een dergelijk veld opnieuw toewijzen aan de = ref operator alleen binnen een constructor of een init accessor. U kunt een waarde toewijzen aan de = operator op elk gewenst moment dat is toegestaan door de wijzigingsfunctie voor veldtoegang.
  • ref readonly: U kunt op enig moment geen waarde met de = operator toewijzen aan een dergelijk veld. U kunt echter een veld opnieuw toewijzen met de = ref operator.
  • readonly ref readonly: U kunt een dergelijk veld alleen opnieuw toewijzen in een constructor of een init accessor. U kunt op elk moment geen waarde toewijzen aan het veld.

De compiler zorgt ervoor dat een verwijzing die is opgeslagen in een ref veld, de referent niet overleeft.

De ref functie velden maakt een veilige implementatie van typen mogelijk, zoals System.Span<T>:

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

    // Omitted for brevity...
}

Het Span<T> type slaat een verwijzing op waarmee deze toegang heeft tot de aaneengesloten elementen in het geheugen. Met het gebruik van een verwijzing kan een Span<T> exemplaar voorkomen dat de opslag waarnaar wordt verwezen, wordt gekopieerd.

C#-taalspecificatie

Zie de volgende secties van de C#-taalspecificatie voor meer informatie:

Zie de offertenota voor structverbeteringen op laag niveau voor meer informatie over ref velden.

Zie ook