C# 13'teki yenilikler
C# 13 aşağıdaki yeni özellikleri içerir. En son Visual Studio 2022 sürümünü veya .NET 9 SDKkullanarak bu özellikleri deneyebilirsiniz:
-
params
koleksiyonları - yeni
lock
türü ve semantiği . -
Yeni kaçış dizisi -
\e
. - Yöntem grubu doğal tür geliştirmeleri
- Nesne başlatıcılarda dizin oluşturucuya örtük erişim
-
Yineleyicilerde ve zaman uyumsuz yöntemlerde
ref
yerel veunsafe
bağlamlarını etkinleştirme -
arabirimleri uygulamak için
ref struct
türlerini etkinleştirin. - Genel türlerdeki tür parametreleri için bağımsız değişken olarak başvuru yapısı türlerine izin ver.
-
Kısmi özelliklere ve dizin oluşturuculara artık
partial
türlerde izin verilir. - Aşırı yükleme çözümleme önceliği kitaplık yazarlarının bir aşırı yüklemeyi diğerlerinden daha iyi olarak belirlemesini sağlar.
Visual Studio 17.12'de başlayan C# 13, önizleme özelliği olarak field
bağlamsal anahtar sözcüğü içerir.
C# 13, .NET 9üzerinde desteklenir. Daha fazla bilgi için bkz. C# dili sürüm oluşturma.
en son .NET 9 SDK'sını .NET indirmeleri sayfasındanindirebilirsiniz. .NET 9 SDK'sını içeren Visual Studio 2022de indirebilirsiniz.
Yeni özellikler genel önizleme sürümlerinde kullanıma sunulduğunda "C#'daki yenilikler" sayfasına eklenir. roslyn özellik durumu sayfasının çalışma kümesi bölümü, yaklaşan özelliklerin ana dala ne zaman birleştirildiğinden.
C# 13'te yapılan önemli değişiklikleri önemli değişiklikler makalemizde bulabilirsiniz.
Not
Bu özelliklerle ilgili geri bildirimlerinizle ilgileniyoruz. Bu yeni özelliklerden herhangi biriyle ilgili sorunlar bulursanız dotnet/roslyn deposunda yeni bir sorun oluşturun.
params
koleksiyonları
params
değiştirici dizi türleriyle sınırlı değildir. artık System.Span<T>, System.ReadOnlySpan<T>ve System.Collections.Generic.IEnumerable<T> uygulayan ve Add
yöntemi olan türler de dahil olmak üzere tanınan herhangi bir koleksiyon türüyle params
kullanabilirsiniz. Somut türlere ek olarak, System.Collections.Generic.IEnumerable<T>, System.Collections.Generic.IReadOnlyCollection<T>, System.Collections.Generic.IReadOnlyList<T>, System.Collections.Generic.ICollection<T>ve System.Collections.Generic.IList<T> arabirimleri de kullanılabilir.
Bir arabirim türü kullanıldığında, derleyici sağlanan bağımsız değişkenler için depolamayı sentezler.
params
koleksiyonları için özellik belirtimihakkında daha fazla bilgi edinebilirsiniz.
Örneğin, yöntem bildirimleri span'leri params
parametreleri olarak bildirebilir:
public void Concat<T>(params ReadOnlySpan<T> items)
{
for (int i = 0; i < items.Length; i++)
{
Console.Write(items[i]);
Console.Write(" ");
}
Console.WriteLine();
}
Yeni kilit nesnesi
.NET 9 çalışma zamanı, iş parçacığı eşitlemesi için yeni bir tür olan System.Threading.Lock türünü içerir. Bu tür, API aracılığıyla daha iyi iş parçacığı senkronizasyonu sağlar.
Lock.EnterScope() yöntemi özel bir kapsama girer. tarafından döndürülen ref struct
, özel kullanım kapsamından çıkmak için Dispose()
desenini destekler.
C# lock
deyimi, kilidin hedefinin Lock
bir nesne olup olmadığını tanır. Bu durumda, System.Threading.Monitorkullanan geleneksel API yerine güncelleştirilmiş API'yi kullanır. Derleyici ayrıca bir Lock
nesnesini başka bir türe dönüştürdüğünüzde Monitor
tabanlı kodun oluşturulacağını da tanır.
yenikilit nesnesinin özellik belirtiminde daha fazla bilgi edinebilirsiniz.
Bu özellik, lock
nesne türünü değiştirerek yeni kitaplık türünün avantajlarından yararlanmanızı sağlar. Başka hiçbir kodun değişmesi gerekmez.
Yeni kaçış dizisi
ESCAPE
karakteri, Unicode U+001B
için karakter sabiti kaçış dizisi olarak \e
kullanabilirsiniz. Daha önce \u001b
veya \x1b
kullandınız.
\x1b
kullanılması önerilmez çünkü 1b
'den sonraki karakterler geçerli onaltılık basamaklarsa, bu karakterler kaçış dizisinin bir parçası haline gelir.
Yöntem grubu doğal türü
Bu özellik, yöntem gruplarını içeren çözümlemeyi aşırı yüklemek için küçük iyileştirmeler yapar. yöntem grubu bir yöntemdir ve tüm aşırı yüklemeler aynı ada sahip olur. Önceki davranış, derleyicinin bir yöntem grubu için aday yöntemlerin tam kümesini oluşturmasıydı. Doğal bir türe ihtiyaç duyulduysa, doğal tür aday yöntemlerin tam kümesinden belirlendi.
Yeni davranış, her kapsamdaki aday yöntemleri kümesini ayıklamak ve geçerli olmayan aday yöntemlerini kaldırmaktır. Genellikle, kaldırılan yöntemler yanlış 'arity' değerine veya karşılanamayan kısıtlamalara sahip 'generic' yöntemlerdir. İşlem, yalnızca hiçbir aday yöntemi bulunamazsa sonraki dış kapsama devam eder. Bu işlem, aşırı yükleme çözümlemesi için genel algoritmayı daha yakından izler. Belirli bir kapsamda bulunan tüm aday yöntemleri eşleşmiyorsa, yöntem grubunun doğal bir türü yoktur.
teklif spesifikasyonundaki değişikliklerin ayrıntılarınıokuyabilirsiniz.
Örtük dizin erişimi
^
örtük "sondan" dizin işlecine artık nesne başlatıcı ifadesinde izin verilir. Örneğin, artık aşağıdaki kodda gösterildiği gibi bir nesne başlatıcıda bir dizi başlatabilirsiniz:
public class TimerRemaining
{
public int[] buffer { get; set; } = new int[10];
}
var countdown = new TimerRemaining()
{
buffer =
{
[^1] = 0,
[^2] = 1,
[^3] = 2,
[^4] = 3,
[^5] = 4,
[^6] = 5,
[^7] = 6,
[^8] = 7,
[^9] = 8,
[^10] = 9
}
};
TimerRemaining
sınıfı, 10 uzunluğunda başlatılan bir buffer
dizisi içerir. Yukarıdaki örnek, "bitişten" dizin işlecini (^
) kullanarak değerleri bu diziye atar ve 9'dan 0'a kadar sayan bir dizi oluşturur.
C# 13'ün önceki sürümlerinde, ^
işleci bir nesne başlatıcıda kullanılamaz. Öğeleri ön taraftan dizine eklemeniz gerekir.
ref
ve unsafe
yineleyicilerde ve async
yöntemlerinde
Bu özellik ve aşağıdaki iki özellik, ref struct
türlerinin yeni yapıları kullanmasını sağlar. Kendi ref struct
türlerinizi yazmadığınız sürece bunları kullanamazsınız. Büyük olasılıkla, System.Span<T> ve System.ReadOnlySpan<T> daha fazla işlev kazandıkça dolaylı bir fayda fark edebilirsiniz.
C# 13'e geçmeden önce yineleyici yöntemler (yield return
kullanan yöntemler) ve async
yöntemler yerel ref
değişkenlerini bildiremez ve unsafe
bağlamlarına sahip olamaz.
C# 13'te, async
yöntemleri ref
yerel değişkenleri veya ref struct
türündeki yerel değişkenleri bildirebilir. Ancak bu değişkenlere bir await
sınırı üzerinden erişilemiyor.
yield return
sınırında bunlara da erişilemiyor.
Bu gevşetme kısıtlaması, derleyicinin ref
yerel değişkenlerin ve ref struct
türlerinin daha fazla yerde doğrulanabilir şekilde güvenli bir şekilde kullanılmasına izin vermesine olanak tanır. Bu yöntemlerde System.ReadOnlySpan<T> gibi türleri güvenle kullanabilirsiniz. Derleyici, güvenlik kurallarını ihlal ederseniz size bildirir.
Aynı şekilde, C# 13 yineleyici yöntemlerinde unsafe
bağlamlara izin verir. Ancak, tüm yield return
ve yield break
deyimleri güvenli bağlamlarda olmalıdır.
allows ref struct
C# 13'te ref struct
türler genel bir tür veya yöntem için tür bağımsız değişkeni olarak bildirilemedi. Artık genel tür bildirimleri allows ref struct
bir kısıtlamadan koruma ekleyebilir. Bu anti-kısıtlama, tür parametresi için verilen tür bağımsız değişkeninin bir ref struct
türü olabileceğini belirtir. Derleyici, bu tür parametrenin tüm örneklerinde referans güvenliği kurallarını uygular.
Örneğin, aşağıdaki koda benzer genel bir tür bildirebilirsiniz:
public class C<T> where T : allows ref struct
{
// Use T as a ref struct:
public void M(scoped T p)
{
// The parameter p must follow ref safety rules
}
}
Bu, System.Span<T> ve System.ReadOnlySpan<T> gibi türlerin uygun olduğunda genel algoritmalarla kullanılmasını sağlar.
where
güncelleştirmeleri ve genel kısıtlamalarıhakkında programlama kılavuzu makalesinde daha fazla bilgi edinebilirsiniz.
ref struct
arabirimleri
C# 13'ten önce, ref struct
türlerinin arabirimleri uygulamasına izin verilmezdi. C# 13'le başlayarak, bunu yapabilir. bir ref struct
türünün bir arabirim uyguladığını bildirebilirsiniz. Ancak, ref güvenlik kurallarını sağlamak için, ref struct
türünün bir arabirim türüne dönüştürülmesi mümkün değildir. Bu dönüştürme bir boxlama dönüştürmesidir ve referans güvenliğini ihlal edebilir. Bir ref struct
açık arabirim yöntemi bildirimlerine yalnızca o tür parametresinin allows ref struct
olduğu bir tür parametresi aracılığıyla erişilebilir. Ayrıca ref struct
türleri, varsayılan uygulama içeren yöntemler de dahil olmak üzere bir arabirimde bildirilen tüm yöntemleri uygulamalıdır.
ref struct
türleri ve allows ref struct
genel kısıtlamasının eklenmesi güncellemeleri hakkında daha fazla bilgi edinin.
Daha fazla kısmi üye
C# 13'te partial
özellikleri ve partial
dizin oluşturucuları bildirebilirsiniz. Kısmi özellikler ve dizin oluşturucular genellikle partial
yöntemleriyle aynı kuralları izler: bildirim bildirim ve bildirim uygulayan biroluşturursunuz. İki bildirimin imzaları eşleşmelidir. Bir kısıtlama, kısmi bir özellik uygulayan için otomatik özellik bildirimini kullanamamanızdır. Bir gövde bildirmeyen özellikler, olarak kabul edilirbildirim.
public partial class C
{
// Declaring declaration
public partial string Name { get; set; }
}
public partial class C
{
// implementation declaration:
private string _name;
public partial string Name
{
get => _name;
set => _name = value;
}
}
kısmi üyeler hakkındakimakalesinde daha fazla bilgi edinebilirsiniz.
Aşırı yükleme çözümleme önceliği
C# 13'te derleyici, bir aşırı yüklemeyi diğerine tercih etmek için OverloadResolutionPriorityAttribute tanır. Kitaplık yazarları, mevcut aşırı yükleme yerine yeni ve daha iyi bir aşırı yüklemenin tercih edilmesini sağlamak için bu özniteliği kullanabilir. Örneğin, daha yüksek performanslı yeni bir aşırı yükleme ekleyebilirsiniz. Kitaplığınızı kullanan mevcut kodu bozmak istemezsiniz, ancak kullanıcıların yeniden derleme yaptıklarında yeni sürüme güncelleştirmelerini istersiniz. Derleyiciye hangi aşırı yüklemenin tercih edilmesi gerektiğini bildirmek için Aşırı yükleme çözümleme önceliği kullanabilirsiniz. En yüksek önceliğe sahip aşırı yüklemeler tercih edilir.
Bu özellik, yeni aşırı yüklemeler eklerken belirsizliği önlemek için kitaplık yazarlarına yöneliktir. Kitaplık yazarlarının karışıklığı önlemek için bu öznitelikle dikkatli olması gerekir.
field
anahtar sözcüğü
field
bağlamsal anahtar sözcüğü, önizleme özelliği olarak C# 13'tedir. Belirteç field
, bir özellik erişimcisindeki derleyici tarafından oluşturulan geri plan alanına erişir. Tür bildiriminizde açık bir yedekleme alanı bildirmeden bir erişimci gövdesi yazmanızı sağlar. Alan destekli bir özellik için erişimcilerden biri veya her ikisi için gövde bildirebilirsiniz.
field
özelliği önizleme özelliği olarak yayınlanır. Bunu kullanarak deneyimlerinizi öğrenmek istiyoruz.
field
adlı bir alanı da içeren türlerde kod okumada hataya neden olabilecek bir değişiklik veya karışıklık vardır.
@field
veya this.field
kullanarak field
anahtar sözcüğüyle tanımlayıcı arasında ayrım yapabilirsiniz.
Önemli
field
anahtar sözcüğü, C# 13'teki bir önizleme özelliğidir.
field
bağlamsal anahtar sözcüğünü kullanmak için .NET 9 kullanıyor olmanız ve <LangVersion>
öğenizi proje dosyanızda preview
olarak ayarlamanız gerekir.
field
adlı bir alana sahip bir sınıfta field
anahtar sözcük özelliğini kullanırken dikkatli olmanız gerekir. Yeni field
anahtar sözcüğü, özellik erişimcisi kapsamında field
adlı bir alanı gölgeler.
field
değişkeninin adını değiştirebilir veya field
tanımlayıcısına @field
olarak başvurmak için @
belirtecini kullanabilirsiniz.
field
anahtar sözcüğü için özellik belirtimini okuyarak daha fazla bilgi edinebilirsiniz.
Bu özelliği dener ve geri bildirimde bulunmak isterseniz, geri bildiriminizi csharplang
deposunda yer alan özellikle ilgili sorun'e ekleyin.
Ayrıca bkz.
- .NET 9'deki yenilikler