İngilizce dilinde oku

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.
  • veya ref struct ile kutulanamaz System.ValueTypeSystem.Object.
  • Bir ref struct değişken bir lambda ifadesinde veya yerel bir işlevde yakalanamaz.
  • C# 13'te ref 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 ref structTaskyöntemlerde kullanabilirsinizTask<TResult>.
  • 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 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.

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:

C#
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):

C#
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ı

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

C#
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 veya erişimcinin = refiçinde işleçle yeniden atayabilirsinizinit. 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:

C#
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 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ü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, yöntemleri açık arabirim bildirimleri olarak bildirebilir. Ancak, bu yöntemlere yalnızca allows ref struct tür parametresine sahip genel yöntemlerden erişilebilir.
  • 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 derlenmez. Varsayılan uygulamayla static arabirim yöntemi için belirli bir uygulama sağlayamazsınız.

Ö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 kesintisi, ref struct'i yeniden derlediğinizde olur: Varsayılan bir uygulama olmasına rağmen, yeni üyenin uygulanması 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.