Aracılığıyla paylaş


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

Bir yapı türü bildirirken değiştiriciyi ref kullanın. Yığında bir ref struct türün örneklerini ayırırsınız ve yönetilen yığına kaçamaz. Bu özelliği sağlamak için, derleyici türlerin ref struct kullanımını aşağıdaki gibi sınırlar:

  • Bir dizinin öğe türü olarak kullanamazsınız ref struct .
  • bir sınıfındaki bir alanın türü olarak veya olmayanref struct bir alan olarak bildiremezsinizref struct.
  • veya için bir kutulayamazsınız ref structSystem.ValueTypeSystem.Object.
  • Lambda ifadesindeki veya yerel işlevdeki bir değişkeni yakalayamazsınızref struct.
  • C# 13'te bir yöntemde async değişkenleri kullanamazsınızref struct. 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 ref structTaskyöntemlerde kullanabilirsinizTask<TResult>.
  • C# 13'te bir değişkeni yineleyicilerde kullanamazsınızref struct. C# 13'den başlayarak, ref struct deyimle kod kesimlerinde yer almamaları koşuluyla ref türler ve yield return 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 structwhere tür bağımsız değişkeni olabilir.

C# dili başvuru belgesi, C# dilinin en son yayımlanan sürümünü gösterir. Ayrıca, yaklaşan dil sürümü için genel önizlemelerdeki özelliklere yönelik ilk belgeleri içerir.

Belgelerde ilk olarak dilin son üç sürümünde veya geçerli genel önizlemelerde sunulan tüm özellikler tanımlanır.

Tavsiye

Bir özelliğin C# dilinde ilk tanıtıldığı zamanları bulmak için C# dil sürümü geçmişi makalesine bakın.

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 readonly değiştiricilerini tür bildiriminde birleştirin ref (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.Span<T>örnekleridirSystem.ReadOnlySpan<T>.

ref Alanları

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: Yalnızca bir oluşturucunun veya init erişimcinin= ref içindeki işleci kullanarak bu alanı 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 bu alana işleçle = bir değer atayamazsınız. Ancak, işlecini kullanarak = ref alanı yeniden atayabilirsiniz.
  • readonly ref readonly: Bu 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. Bir başvuru kullanarak, bir Span<T> örnek başvurduğu depolamanın kopyalanmasını önler.

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 structemin olun. Yani, erişilebilir, parametresiz ve dönüş türüne sahip bir Dispose örnek void yöntemine sahiptir. using deyimini veya bildirimini tek kullanımlık bir örneğiyle kullanabilirsinizref struct.

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

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üvenlik kurallarına uymasını sağlar.

  • bir'i ref struct , uyguladığı arabirimin örneğine dönüştüremezsiniz. Bu kısıtlama, bağımsız değişken olarak bir ref struct tür kullandığınızda ve parametre bir arabirim türü olduğunda ö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, yöntemleri açık arabirim bildirimleri olarak bildirebilir. Ancak, bu yöntemlere yalnızca tür parametresinin allows ref struct türündeki genel yöntemlerden erişebilirsiniz.
  • Arabirim uygulayan bir ref struct tüm örnek arabirimi üyelerini uygulamalıdır. arabirim varsayılan bir uygulama içerdiğinde bile ref struct örnek üyelerini 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. Yeni örnek yöntemleri için bir uygulama sağlayana kadar uygulamanız derlenemez. Varsayılan uygulamayla static arabirim yöntemi için belirli bir uygulama sağlayamazsınız.

Önemli

Bir türe sahip bir ref struct arabirim uygulamak, daha sonra kaynak kesme ve ikili hataya neden olan değişikliklere yönelik potansiyele neden olur. Kesme, bir başka derlemede ref struct tanımlanan bir arabirim uygularsa ve bu derleme bu arabirime varsayılan üyeler 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.