Ekinlikler
17 Mar 21 - 21 Mar 10
Diğer geliştiriciler ve uzmanlarla gerçek dünyadaki kullanım örneklerini temel alan ölçeklenebilir yapay zeka çözümleri oluşturmak için toplantı serisine katılın.
Hemen kaydolunBu tarayıcı artık desteklenmiyor.
En son özelliklerden, güvenlik güncelleştirmelerinden ve teknik destekten faydalanmak için Microsoft Edge’e yükseltin.
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:
ref struct
dizinin öğe türü olamaz.ref struct
sınıfın veya olmayanref struct
bir alanın bildirilen türü olamaz.ref struct
ile kutulanamaz System.ValueTypeSystem.Object.ref struct
değişken bir lambda ifadesinde veya yerel bir işlevde yakalanamaz.ref struct
değişkenler bir async
yöntemde kullanılamaz. C# 13'le başlayarak, bir ref struct
değişken bir yöntemdeki ifadeyle await
aynı blokta async
kullanılamaz. Ancak, değişkenleri zaman uyumlu yöntemlerde, örneğin veya döndüren ref struct
Taskyöntemlerde kullanabilirsinizTask<TResult>.ref struct
bir değişken yineleyicilerde kullanılamaz. C# 13'den başlayarak, ref struct
deyimle kod kesimlerinde yer almamaları koşuluyla ref
türler ve yield return
yerel ayarlar yineleyicilerde kullanılabilir.ref struct
uygulanamaz. C# 13'le başlayarak, bir ref
yapı arabirimleri uygulayabilir, ancak başvuru güvenliği kurallarına uyması gerekir. Örneğin, bir ref struct
tür, bir kutulama dönüştürmesi gerektirdiğinden arabirim türüne dönüştürülemez.ref struct
bağımsız değişkeni olamaz. C# 13'le başlayarak, ref struct
type parametresi yan tümcesinde öğesini belirttiğinde allows 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>.
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 veya init
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 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.
Bu kısıtlamalar, arabirim uygulayan bir ref struct
türün gerekli başvuru güvenliği kurallarına uymasını sağlar.
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 bir ref 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
, yöntemleri açık arabirim bildirimleri olarak bildirebilir. Ancak, bu yöntemlere yalnızca allows ref struct
tür parametresine sahip genel yöntemlerden erişilebilir.ref struct
tüm örnek arabirimi üyelerini uygulamalıdır. arabirim varsayılan bir uygulama içerdiğinde bile ref 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.
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.
.NET geri bildirimi
.NET, açık kaynak bir projedir. Geri bildirim sağlamak için bir bağlantı seçin:
Ekinlikler
17 Mar 21 - 21 Mar 10
Diğer geliştiriciler ve uzmanlarla gerçek dünyadaki kullanım örneklerini temel alan ölçeklenebilir yapay zeka çözümleri oluşturmak için toplantı serisine katılın.
Hemen kaydolun