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.
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 olmayan
ref structbir 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ız
ref struct. - C# 13'te bir yöntemde
asyncdeğişkenleri kullanamazsınızref struct. 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 bir değişkeni yineleyicilerde kullanamazsınız
ref struct. 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.
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 veyainiterişimcinin= refiç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= refalanı yeniden atayabilirsiniz. -
readonly ref readonly: Bu 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. 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 birref structtü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. birref struct, yöntemleri açık arabirim bildirimleri olarak bildirebilir. Ancak, bu yöntemlere yalnızca tür parametresininallows ref structtüründeki genel yöntemlerden erişebilirsiniz. - 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
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.