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.ValueType System.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üren Task Task<TResult>yöntemlerde kullanabilirsinizref struct
. - 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şuluylayield return
türler veref
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 ref
değiştiricilerini tür bildiriminde birleştirin readonly
(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.ReadOnlySpan<T>örnekleridirSystem.Span<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 veyainit
erişimcinin= ref
içinde işleçle 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, 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 void
örnek Dispose
yöntemine sahiptir. using deyimini veya bildirimini tek kullanımlık bir örneğiyle kullanabilirsinizref struct
.
C# 13'le başlayarak, türlerde ref struct
de IDisposable uygulayabilirsiniz. Ancak aşırı yükleme çözünürlüğü, arabirim yöntemine atılabilir deseni tercih eder. Derleyici yalnızca uygun Dispose
bir yöntem bulunamadığında bir IDisposable.Dispose
yönteme çözümlemektedir.
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. - Bir
ref struct
arabirim uygulayan tüm arabirim üyelerini uygulamalıdır . ,ref struct
arabiriminin varsayılan bir uygulama içerdiği üyeleri 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. Bu yeni yöntemler için bir uygulama sağlayana kadar uygulamanız derlenmez.
Ö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 sonu, öğesini yeniden derlediğinizde ref struct
gerç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.