Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 structdizinin öğe türü olamaz. - bir
ref structsınıfın veya olmayanref structbir alanın bildirilen türü olamaz. - veya
ref structile kutulanamaz System.ValueTypeSystem.Object. - Bir
ref structdeğişken bir lambda ifadesinde veya yerel bir işlevde yakalanamaz. - C# 13'te
ref structdeğişkenler birasyncyöntemde kullanılamaz. C# 13'le başlayarak, birref structdeğişken bir yöntemdeki ifadeyleawaitaynı bloktaasynckullanılamaz. Ancak, değişkenleri zaman uyumlu yöntemlerde, örneğin veya döndürenref structTaskyöntemlerde kullanabilirsinizTask<TResult>. - C# 13'te
ref structbir değişken yineleyicilerde kullanılamaz. C# 13'den başlayarak,ref structdeyimle kod kesimlerinde yer almamaları koşuluylareftürler veyield returnyerel ayarlar yineleyicilerde kullanılabilir. - C# 13'e geçmeden önce, arabirimler
ref structuygulanamaz. C# 13'le başlayarak, birrefyapı arabirimleri uygulayabilir, ancak başvuru güvenliği kurallarına uyması gerekir. Örneğin, birref structtü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 structbağımsız değişkeni olamaz. C# 13'le başlayarak,ref structtype parametresi yan tümcesinde öğesini belirttiğindeallows ref structwheretü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 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: 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= refbir alanı yeniden atayabilirsiniz. -
readonly ref readonly: Böyle bir alanı yalnızca bir oluşturucuda veyainiteriş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 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 birref structtü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. birref struct, yöntemleri açık arabirim bildirimleri olarak bildirebilir. Ancak, bu yöntemlere yalnızcaallows ref structtür parametresine sahip genel yöntemlerden erişilebilir. - Arabirim uygulayan bir
ref structtüm örnek arabirimi üyelerini uygulamalıdır. arabirim varsayılan bir uygulama içerdiğinde bileref 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
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 üyeler 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.