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. - A
ref struct
, arabirimleri uygulayamaz. - veya
ref struct
ile kutulanamaz System.ValueTypeSystem.Object. - Tür
ref struct
bağımsız değişkeni olamaz. - Bir
ref struct
değişken bir lambda ifadesi veya yerel işlev tarafından yakalanamaz. - Bir
ref struct
değişken birasync
yöntemde kullanılamaz. Ancak, değişkenleri zaman uyumlu yöntemlerde, örneğin veya döndüren TaskTask<TResult>yöntemlerde kullanabilirsinizref struct
. - Değişken
ref struct
yineleyicilerde kullanılamaz.
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
.
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, böyle bir alana işleçle=
bir 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.
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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin