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.
  • veya ref struct ile kutulanamaz System.ValueType System.Object.
  • 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.
  • C# 13'e geçmeden önce, arabirimler ref struct uygulanamaz. C# 13'le başlayarak, bir ref yapı arabirimleri uygulayabilir, ancak başvuru güvenliği kurallarına uyması gerekir. Örneğin, bir ref struct tür, bir kutulama dönüştürmesi gerektirdiğinden arabirim türüne dönüştürülemez.
  • C# 13'e geçmeden önce tür ref struct bağımsız değişkeni olamaz. C# 13'le başlayarak, ref struct type parametresi yan tümcesinde öğesini belirttiğinde allows ref struct where tür bağımsız değişkeni olabilir.

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.

Tek kullanımlık desen

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.

C# 13'le başlayarak, türlerde ref struct de IDisposable uygulayabilirsiniz. Ancak aşırı yükleme çözünürlüğü, arabirim yöntemine atılabilir deseni tercih eder. Derleyici yalnızca uygun Dispose bir yöntem bulunamadığında bir IDisposable.Dispose yönteme çözümlemektedir.

Arabirim uygulayan türler için ref struct kısıtlamalar

Bu kısıtlamalar, arabirim uygulayan bir ref struct türün gerekli başvuru güvenliği kurallarına uymasını sağlar.

  • A ref struct , uyguladığı bir arabirimin örneğine dönüştürülemez. Bu kısıtlama, parametre bir arabirim türü olduğunda bağımsız değişken olarak bir ref struct tür kullandığınızda örtük dönüştürmeyi içerir. Dönüştürme, başvuru güvenliğini ihlal eden bir kutulama dönüştürmesine neden olur.
  • Bir ref struct arabirim uygulayan tüm arabirim üyelerini uygulamalıdır . , ref struct arabiriminin varsayılan bir uygulama içerdiği üyeleri uygulamalıdır.

Derleyici bu kısıtlamaları uygular. Arabirimleri uygulayan türler yazarsanız ref struct , her yeni güncelleştirme yeni varsayılan arabirim üyeleri içerebilir. Bu yeni yöntemler için bir uygulama sağlayana kadar uygulamanız derlenmez.

Önemli

ref struct Bir arabirim uygulayan, daha sonra kaynak kıran ve ikili hataya neden olan değişikliklere yönelik potansiyeli içerir. Kesme, bir başka derlemede ref struct tanımlanan bir arabirim uygularsa ve bu derleme bu arabirime varsayılan üyeleri ekleyen bir güncelleştirme sağlarsa oluşur.

Kaynak sonu, öğesini yeniden derlediğinizde ref structgerçekleşir: Varsayılan bir uygulama olsa bile yeni üyeyi uygulaması gerekir.

İkili kesme, türü yeniden derlemeden ref struct dış derlemeyi yükseltirseniz ve güncelleştirilmiş kod yeni yöntemin varsayılan uygulamasını çağırırsa gerçekleşir. Varsayılan üyeye erişildiğinde çalışma zamanı bir özel durum oluşturur.

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.