Aracılığıyla paylaş


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.ValueType System.Object.
  • Tür ref struct bağımsız değişkeni olamaz.
  • Bir ref struct değişken bir lambda ifadesinde veya yerel bir işlevde yakalanamaz.
  • C# 13'teref struct değişkenler bir async yöntemde kullanılamaz. C# 13'le başlayarak, bir ref struct değişken bir yöntemdeki ifadeyle await aynı blokta async kullanılamaz. Ancak, değişkenleri zaman uyumlu yöntemlerde, örneğin veya döndüren Task Task<TResult>yöntemlerde kullanabilirsinizref struct.
  • C# 13'te ref struct bir değişken yineleyicilerde kullanılamaz. C# 13'den başlayarak, ref struct deyimle kod kesimlerinde yer almamaları koşuluyla yield return türler ve ref yerel ayarlar yineleyicilerde kullanılabilir.

Tek kullanımlık ref structbir tanımlayabilirsiniz. Bunu yapmak için tek kullanımlık desene uyduğundan ref struct emin 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 struct readonlybildirmek 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 struct System.ReadOnlySpan<T>örnekleridirSystem.Span<T>.

ref Alanları

C# 11'le başlayarak, aşağıdaki örnekte gösterildiği gibi içinde bir ref ref 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, işleçle böyle = bir alana 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.