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 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 birasync
yöntemde kullanılamaz. C# 13'le başlayarak, birref struct
değişken bir yöntemdeki ifadeyleawait
aynı bloktaasync
kullanılamaz. Ancak, değişkenleri zaman uyumlu yöntemlerde, örneğin veya döndürenref struct
Taskyö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şuluylaref
türler veyield return
yerel ayarlar yineleyicilerde kullanılabilir. - C# 13'e geçmeden önce, arabirimler
ref struct
uygulanamaz. C# 13'le başlayarak, birref
yapı arabirimleri uygulayabilir, ancak başvuru güvenliği kurallarına uyması gerekir. Örneğin, birref 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ğindeallows 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
readonly
bildirmek için ve readonly
değiştiricilerini tür bildiriminde birleştirin ref
(readonly
değ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.Span<T>örnekleridirSystem.ReadOnlySpan<T>.
ref
Alanları
C# 11'le başlayarak, aşağıdaki örnekte gösterildiği gibi içinde bir ref
ref struct
alan 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 null
olup 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= ref
iç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 veyainit
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 struct
bir 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 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 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. birref struct
, yöntemleri açık arabirim bildirimleri olarak bildirebilir. Ancak, bu yöntemlere yalnızcaallows 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 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 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.