ref yapı türleri (C# başvurusu)

Değiştiriciyi ref bir yapı türünün bildiriminde kullanabilirsiniz. Bir ref struct türün örnekleri yığında ayrılır ve yönetilen yığına kaçamaz. Derleyici, türlerin kullanımını ref struct aşağıdaki gibi sınırlandırdığından emin olmak için:

  • Bir ref struct dizinin öğe türü olamaz.
  • bir ref struct sınıfın veya olmayanref struct bir alanın bildirilen türü olamaz.
  • A ref struct , arabirimleri uygulayamaz.
  • veya ref struct ile kutulanamaz System.ValueTypeSystem.Object.
  • Tür ref struct bağımsız değişkeni olamaz.
  • Bir ref struct değişken bir lambda ifadesi veya yerel işlev tarafından yakalanamaz.
  • Bir ref struct değişken bir async yöntemde kullanılamaz. Ancak, değişkenleri zaman uyumlu yöntemlerde, örneğin veya döndüren TaskTask<TResult>yöntemlerde kullanabilirsinizref struct.
  • Değişken ref struct yineleyicilerde kullanılamaz.

Tek kullanımlık ref structbir tanımlayabilirsiniz. Bunu yapmak için tek kullanımlık desene uyduğundan ref structemin olun. Yani, erişilebilir, parametresiz ve dönüş türüne sahip bir void örnek Dispose yöntemine sahiptir. using deyimini veya bildirimini tek kullanımlık bir örneğiyle kullanabilirsinizref struct.

Genellikle, türlerin veri üyelerini ref struct de içeren bir türe ihtiyacınız olduğunda bir tür tanımlarsınızref struct:

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

olarak ref structreadonlybildirmek için ve ref değiştiricilerini tür bildiriminde birleştirin readonly (readonlydeğiştirici değiştiriciden ref önce gelmelidir):

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

.NET'te, ve ref structSystem.ReadOnlySpan<T>örnekleridirSystem.Span<T>.

ref Alanları

C# 11'le başlayarak, aşağıdaki örnekte gösterildiği gibi içinde bir refref structalan bildirebilirsiniz:

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

Bir ref alanın değeri olabilir null . Unsafe.IsNullRef<T>(T) Bir ref alanın nullolup olmadığını belirlemek için yöntemini kullanın.

Değiştiriciyi readonly bir ref alana aşağıdaki yollarla uygulayabilirsiniz:

  • readonly ref: Böyle bir alanı yalnızca bir oluşturucunun veyainit erişimcinin = refiçinde işleçle yeniden atayabilirsiniz. Alan erişim değiştiricisi = tarafından izin verilen herhangi bir noktada işleçle bir değer atayabilirsiniz.
  • ref readonly: Herhangi bir noktada, böyle bir alana işleçle = bir değer atayamazsınız. Ancak, işleciyle = ref bir alanı yeniden atayabilirsiniz.
  • readonly ref readonly: Böyle bir alanı yalnızca bir oluşturucuda veya init erişimcide yeniden atayabilirsiniz. Herhangi bir noktada, alana bir değer atayamazsınız.

Derleyici, bir ref alanda depolanan bir başvurunun başvurudan daha uzun yaşamamasını sağlar.

Alanlar ref özelliği, gibi System.Span<T>türlerin güvenli bir şekilde uygulanmasını sağlar:

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

    // Omitted for brevity...
}

türü Span<T> , bellekteki bitişik öğelere eriştiği bir başvuruyu depolar. Başvurunun kullanılması, örneğin Span<T> başvurduğu depolama alanını kopyalamasını önlemesini sağlar.

C# dili belirtimi

Daha fazla bilgi için C# dil belirtiminin aşağıdaki bölümlerine bakın:

Alanlar hakkında ref daha fazla bilgi için Alt düzey yapı geliştirmeleri teklif notu'na bakın.

Ayrıca bkz.