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 structiç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 recordrecord 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:

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:

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 structbenzer ş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.

Ayrıca bkz.