C# 12'deki yenilikler
C# 12 aşağıdaki yeni özellikleri içerir. En son Visual Studio 2022 sürümünü veya .NET 8 SDK'sını kullanarak bu özellikleri deneyebilirsiniz.
Birincil oluşturucular - Visual Studio 2022 sürüm 17.6 Önizleme 2'de kullanıma sunulmuştur.
Koleksiyon ifadeleri - Visual Studio 2022 sürüm 17.7 Önizleme 5'te kullanıma sunuldu.
Satır içi diziler - Visual Studio 2022 sürüm 17.7 Önizleme 3'te kullanıma sunuldu.
Lambda ifadelerindeki isteğe bağlı parametreler - Visual Studio 2022 sürüm 17.5 Önizleme 2'de kullanıma sunuldu.
ref readonly
parameters - Visual Studio 2022 sürüm 17.8 Önizleme 2'de kullanıma sunulmuştur.Diğer ad: Visual Studio 2022 sürüm 17.6 Önizleme 3'te kullanıma sunuldu.
Deneysel öznitelik - Visual Studio 2022 sürüm 17.7 Önizleme 3'te kullanıma sunulmuştur.
Interceptors - Preview özelliği Visual Studio 2022 sürüm 17.7 Önizleme 3'te kullanıma sunuldu.
C# 12, .NET 8'de desteklenir. Daha fazla bilgi için bkz . C# dil sürümü oluşturma.
En son .NET 8 SDK'sını .NET indirmeleri sayfasından indirebilirsiniz. .NET 8 SDK'sını içeren Visual Studio 2022'yi de indirebilirsiniz.
Not
Bu özelliklerle ilgili geri bildirimlerinizle ilgileniyoruz. Bu yeni özelliklerden herhangi biriyle ilgili sorunlar bulursanız dotnet/roslyn deposunda yeni bir sorunoluşturun.
Birincil oluşturucular
Artık herhangi bir class
ve struct
içinde birincil oluşturucular oluşturabilirsiniz. Birincil oluşturucular artık türle record
sınırlı değildir. Birincil oluşturucu parametreleri, sınıfın tüm gövdesinin kapsamındadır. Tüm birincil oluşturucu parametrelerinin kesinlikle atandığından emin olmak için, açıkça bildirilen tüm oluşturucuların söz dizimi kullanarak this()
birincil oluşturucuyu çağırması gerekir. öğesine class
birincil oluşturucu eklemek, derleyicinin örtük parametresiz oluşturucu bildirmesini engeller. içinde struct
, örtük parametresiz oluşturucu, birincil oluşturucu parametreleri de dahil olmak üzere tüm alanları 0 bit desenine başlatır.
Derleyici, birincil oluşturucu parametreleri için yalnızca veya record struct
türlerinde record
record class
genel özellikler oluşturur. Kayıtsız sınıflar ve yapılar her zaman birincil oluşturucu parametreleri için bu davranışı istemeyebilir.
Birincil oluşturucuları keşfetme öğreticisinde ve örnek oluşturucuları makalesinde birincil oluşturucular hakkında daha fazla bilgi edinebilirsiniz.
Koleksiyon ifadeleri
Koleksiyon ifadeleri, ortak koleksiyon değerleri oluşturmak için yeni bir terse söz dizimi ekler. Spread işleci ..
kullanılarak diğer koleksiyonların bu değerlere çizilmesi mümkündür.
Dış BCL desteği gerekmeden çeşitli koleksiyon benzeri türler oluşturulabilir. Bu türler şunlardır:
- gibi
int[]
dizi türleri. - System.Span<T> ve System.ReadOnlySpan<T>.
- Koleksiyon başlatıcılarını destekleyen türler, örneğin System.Collections.Generic.List<T>.
Aşağıdaki örneklerde koleksiyon ifadelerinin kullanımları gösterilmektedir:
// Create an array:
int[] a = [1, 2, 3, 4, 5, 6, 7, 8];
// Create a list:
List<string> b = ["one", "two", "three"];
// Create a span
Span<char> c = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i'];
// Create a jagged 2D array:
int[][] twoD = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
// Create a jagged 2D array from variables:
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[][] twoDFromVariables = [row0, row1, row2];
Bir koleksiyon ifadesindeki spread işleci, ..
bağımsız değişkenini bu koleksiyondaki öğelerle değiştirir. Bağımsız değişken bir koleksiyon türü olmalıdır. Aşağıdaki örneklerde spread işlecinin nasıl çalıştığı gösterilmektedir:
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[] single = [.. row0, .. row1, .. row2];
foreach (var element in single)
{
Console.Write($"{element}, ");
}
// output:
// 1, 2, 3, 4, 5, 6, 7, 8, 9,
Spread işlecinin işleneni, numaralandırılabilir bir ifadedir. Spread işleci numaralandırmalar ifadesinin her öğesini değerlendirir.
Koleksiyon ifadelerini bir öğe koleksiyonuna ihtiyacınız olan her yerde kullanabilirsiniz. Bir koleksiyon için ilk değeri belirtebilir veya koleksiyon türlerini alan yöntemlere bağımsız değişken olarak geçirilebilirler. Koleksiyon ifadeleriyle ilgili dil başvuru makalesinde veya özellik belirtiminde koleksiyon ifadeleri hakkında daha fazla bilgi edinebilirsiniz.
ref readonly
Parametre
C# salt okunur başvuruları geçirmenin bir yolu olarak parametreler ekledi in
. in
parametreleri hem değişkenlere hem de değerlere izin verir ve bağımsız değişkenlerde ek açıklama olmadan kullanılabilir.
Parametrelerin ref readonly
eklenmesi, parametreleri veya in
parametreleri kullanan ref
API'ler için daha netlik sağlar:
- Daha önce
in
oluşturulan API'ler, bağımsız değişken değiştirilmese bile kullanabilirref
. Bu API'ler ileref readonly
güncelleştirilebilir. Parametresi olarak değiştirildiğindein
olduğu gibi arayanlar için hatayaref
neden olan bir değişiklik olmayacaktır. System.Runtime.InteropServices.Marshal.QueryInterface bunun bir örneğidir. - Bir
in
parametreyi alıp mantıksal olarak değişken gerektiren API'ler. Değer ifadesi çalışmaz. System.ReadOnlySpan<T>.ReadOnlySpan<T>(T) bunun bir örneğidir. - Bir değişken gerektirdiği için kullanan
ref
, ancak bu değişkenin sesini kapatmayan API'ler. System.Runtime.CompilerServices.Unsafe.IsNullRef bunun bir örneğidir.
Parametreler hakkında ref readonly
daha fazla bilgi edinmek için dil başvurusundaki parametre değiştiricileri veya ref readonly parameters özellik belirtimi makalesine bakın.
Varsayılan lambda parametreleri
Artık lambda ifadelerindeki parametreler için varsayılan değerler tanımlayabilirsiniz. Söz dizimi ve kurallar, herhangi bir yönteme veya yerel işleve bağımsız değişkenler için varsayılan değerler eklemekle aynıdır.
Lambda ifadeleriyle ilgili makalede lambda ifadelerindeki varsayılan parametreler hakkında daha fazla bilgi edinebilirsiniz.
Herhangi bir türe diğer ad verme
Diğer ad yönergesini using
yalnızca adlandırılmış türler değil, herhangi bir türü diğer ad olarak kullanmak için kullanabilirsiniz. Bu, tanımlama grubu türleri, dizi türleri, işaretçi türleri veya diğer güvenli olmayan türler için anlamsal diğer adlar oluşturabileceğiniz anlamına gelir. Daha fazla bilgi için özellik belirtimine bakın.
Satır içi diziler
Satır içi diziler, çalışma zamanı ekibi ve diğer kitaplık yazarları tarafından uygulamalarınızdaki performansı geliştirmek için kullanılır. Satır içi diziler, bir geliştiricinin bir türdeki sabit boyutlu bir struct
dizi oluşturmasını sağlar. Satır içi arabelleğe sahip bir yapı, güvenli olmayan sabit boyutlu arabelleğe benzer performans özellikleri sağlamalıdır. Büyük olasılıkla kendi satır içi dizilerinizi bildirmezsiniz, ancak çalışma zamanı API'leri olarak veya System.ReadOnlySpan<T> nesne olarak kullanıma sunulduğunda bunları saydam bir şekilde System.Span<T> kullanırsınız.
Satır içi dizi aşağıdakine struct
benzer şekilde bildirilir:
[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer
{
private int _element0;
}
Bunları diğer diziler gibi kullanırsınız:
var buffer = new Buffer();
for (int i = 0; i < 10; i++)
{
buffer[i] = i;
}
foreach (var i in buffer)
{
Console.WriteLine(i);
}
Aradaki fark, derleyicinin satır içi dizi hakkındaki bilinen bilgilerden yararlanabilmesidir. Satır içi dizileri büyük olasılıkla diğer dizilerde olduğu gibi tüketirsiniz. Satır içi dizileri bildirme hakkında daha fazla bilgi için türlerdeki dil başvurusuna struct
bakın.
Deneysel öznitelik
Türler, yöntemler veya derlemeler, deneysel bir özelliği belirtmek için ile System.Diagnostics.CodeAnalysis.ExperimentalAttribute işaretlenebilir. ile ek açıklamalı bir yönteme veya türe erişerseniz derleyici bir uyarı oluşturur ExperimentalAttribute. özniteliğiyle işaretlenmiş bir derlemeye dahil edilen Experimental
tüm türler deneyseldir. Derleyici tarafından okunan Genel öznitelikler veya özellik belirtimi makalesinde daha fazla bilgi edinebilirsiniz.
Durdurucular
Uyarı
Kesiciler, C# 12 ile önizleme modunda kullanılabilen deneysel bir özelliktir. Özellik, gelecek bir sürümde hataya neden olan değişikliklere veya kaldırmaya tabi olabilir. Bu nedenle, üretim veya yayınlanmış uygulamalar için önerilmez.
Kesme avcılarını kullanmak için kullanıcı projesi özelliğini <InterceptorsPreviewNamespaces>
belirtmelidir. Bu, kesme noktası içermesine izin verilen ad alanlarının listesidir.
Örneğin: <InterceptorsPreviewNamespaces>$(InterceptorsPreviewNamespaces);Microsoft.AspNetCore.Http.Generated;MyLibrary.Generated</InterceptorsPreviewNamespaces>
Kesme noktası oluşturucu, araya girilebilen bir yönteme yapılan çağrıyı bildirimli olarak derleme zamanında kendisine yapılan bir çağrıyla değiştirebilen bir yöntemdir. Bu değiştirme, kesicinin araya aldığı çağrıların kaynak konumlarını bildirmesini sağlayarak gerçekleşir. Kesme noktaları, örneğin kaynak oluşturucuda bir derlemeye yeni kod ekleyerek mevcut kodun semantiğini değiştirmek için sınırlı bir tesis sağlar.
Var olan bir kaynak derlemesine kod eklemek yerine değiştirmek için kaynak oluşturucunun parçası olarak bir kesme noktası kullanırsınız. Kaynak oluşturucu, kesişebilir bir yönteme yapılan çağrıları kesme noktası yöntemine yapılan bir çağrıyla değiştirmektedir.
Kesme noktası avcılarıyla denemeler yapmayı düşünüyorsanız özellik belirtimini okuyarak daha fazla bilgi edinebilirsiniz. Özelliği kullanıyorsanız, bu deneysel özelliğin özellik belirtimindeki değişikliklerden haberdar olduğunuzdan emin olun. Özellik sonlandırılırsa, bu siteye daha fazla rehberlik ekleriz.