Aracılığıyla paylaş


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 SDKkullanarak bu özellikleri deneyebilirsiniz.

  • Birincil oluşturucular - Visual Studio 2022 sürüm 17.6 Önizleme 2'de kullanıma sunuldu.

  • Collection ifadeleri - Visual Studio 2022 sürüm 17.7 Önizleme 5'te kullanıma sunuldu.

  • Satır İçi diziler - Visual Studio 2022 sürüm 17.7 Önizleme 3'te kullanıma sunuldu.

  • lambda ifadelerinde isteğe bağlı parametreler - Visual Studio 2022 sürüm 17.5 Önizleme 2'de kullanıma sunulmuştur.

  • ref readonly parametreleri - Visual Studio 2022 sürüm 17.8 Önizleme 2'de kullanıma sunuldu.

  • Herhangi bir tür için takma ad - Visual Studio 2022 sürüm 17.6 Önizleme 3'te kullanıma sunulmuştur.

  • Deneysel öznitelik - Visual Studio 2022 sürüm 17.7 Önizleme 3'te kullanıma sunuldu.

  • Interceptors - Preview özelliği Visual Studio 2022 sürüm 17.7 Preview 3'te kullanıma sunuldu.

C# 12, .NET 8üzerinde desteklenir. Daha fazla bilgi için bkz. C# dili sürüm oluşturma.

en son .NET 8 SDK'sını .NET indirmeleri sayfasındanindirebilirsiniz. .NET 8 SDK'sını içeren Visual Studio 2022indirebilirsiniz.

Not

Bu özelliklerle ilgili geri bildirimlerinizle ilgileniyoruz. Bu yeni özelliklerden herhangi biriyle ilgili sorunlar bulursanız, dotnet/roslyn deposunda yeni bir sorun oluşturun.

Birincil oluşturucular

Artık class ve struct'de birincil yapıcılar oluşturabilirsiniz. Birincil oluşturucular artık record türleriyle 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 this() söz dizimi kullanarak birincil oluşturucuyu çağırması gerekir. Bir class'e temel bir oluşturucu eklemek, derleyicinin örtük parametresiz oluşturucu bildirmesini engeller. structdurumunda, gizli parametresiz bir oluşturucu, birincil oluşturucu parametreleri de dahil olmak üzere tüm alanları 0 bit desenine başlatır.

Derleyici, yalnızca record türlerinde, yani record class veya record struct türlerinde, birincil oluşturucu parametreleri için 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. ..ebir yayılım operatörü kullanılarak diğer koleksiyonları bu değerlere içeri almak 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 öğesi..e bu ifadedeki tüm öğeleri ekler. Bağımsız değişken bir koleksiyon türü olmalıdır. Aşağıdaki örneklerde spread öğesinin 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 öğesi numaralandırmalar ifadesinin her öğesini değerlendirir. Her öğe çıkış koleksiyonuna eklenir.

Koleksiyon ifadelerini bir öğe koleksiyonuna ihtiyacınız olan her yerde kullanabilirsiniz. Bir koleksiyon için başlangıç değerini belirtebilir veya koleksiyon türlerini kabul eden yöntemlere argüman olarak aktarılabilirler. Koleksiyon ifadeleri hakkında daha fazla bilgi edinmek için dil başvurusu makalesinde veya özellik belirtimi'te bulunan'e bakabilirsiniz.

ref readonly parametreleri

C#, salt okunabilir referansları geçirmenin bir yolu olarak in parametreleri ekledi. 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.

ref readonly parametrelerinin eklenmesi, ref parametreleri veya in parametreleri kullanan API'ler için daha netlik sağlar:

ref readonly parametreleri hakkında daha fazla bilgi edinmek için dil referansındaki parametre değiştiricileri makalesine veya özellik spesifikasyonu başvuruya 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 metoda veya yerel işlevde bağımsız değişkenlere varsayılan değerler ekleme süreciyle aynıdır.

lambda ifadelerindeki varsayılan parametreler hakkında daha fazla bilgi için lambda ifadeleri makalesinde bulabilirsiniz.

Herhangi bir türe takma ad atama

using diğer ad yönergesini kullanarak yalnızca adlandırılmış türler değil, herhangi bir tür için de diğer ad oluşturabilirsiniz. Bu, tuple türleri, dizi türleri, işaretçi türleri veya diğer güvensiz türler için anlamlı diğer adlar (alias) oluşturabileceğiniz anlamına gelir. Daha fazla bilgi için bkz. özellik belirtimi. Örnek bir yeniden düzenleme kılavuzu için bkz. .NET blogherhangi bir tür diğer ad kullanarak kodunuzu yeniden düzenleme.

Satır içi diziler

Satır içi diziler, uygulamalarınızdaki performansı geliştirmek için çalışma zamanı ekibi ve diğer kütüphane geliştiricileri tarafından kullanılır. Satır içi diziler, bir geliştiricinin struct türünde sabit boyutlu bir 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'lerinden System.Span<T> veya System.ReadOnlySpan<T> nesneler olarak kullanıma sunulduklarında bunları saydam bir şekilde kullanırsınız.

satır içi dizi aşağıdaki 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. Muhtemelen satır içi dizileri diğer diziler gibi tüketirsiniz. Dahili dizileri tanımlamak hakkında daha fazla bilgi için, struct türleriyle ilgili dil kılavuzuna bakın.

Deneysel öznitelik

Türler, yöntemler veya derlemeler, deneysel bir özelliği belirtmek için System.Diagnostics.CodeAnalysis.ExperimentalAttribute ile işaretlenebilir. ExperimentalAttributeile ek açıklamalı bir yönteme veya türe erişerseniz derleyici bir uyarı oluşturur. Experimental özniteliğiyle işaretlenmiş bir derlemeye dahil edilen tüm türler deneyseldir. Derleyici tarafından okunanGenel öznitelikleri veya özellik belirtimimakalesinde daha fazla bilgi edinebilirsiniz.

Engelleyiciler

Uyarı

Kesiciler, C# 12 ile önizleme modunda kullanılabilen deneysel bir özelliktir. Özellik, gelecekteki bir sürümde bozucu değişikliklere veya kaldırılmasına tabi olabilir. Bu nedenle, üretim veya yayınlanmış uygulamalar için önerilmez.

Önleyicileri kullanmak için, kullanıcı projesinin <InterceptorsPreviewNamespaces>özelliğini belirtmesi gerekir. Bu, kesme noktası içermesine izin verilen ad alanlarının listesidir.

Örneğin: <InterceptorsPreviewNamespaces>$(InterceptorsPreviewNamespaces);Microsoft.AspNetCore.Http.Generated;MyLibrary.Generated</InterceptorsPreviewNamespaces>

engelleyici, engellenebilir bir yönteme yapılan çağrıyı derleme zamanında kendisine yapılan çağrıyla bildirimsel olarak 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. Engelleyiciler, örneğin bir kaynak oluşturucuda bir derlemeye yeni kod eklemek suretiyle mevcut kodun semantiğini değiştirmek için sınırlı bir olanak sağlar.

Mevcut bir kaynak derlemesine kod eklemek yerine değiştirmek için bir kaynak oluşturucunun parçası olarak kesici kullanırsınız. Kaynak oluşturucu, kesilebilir bir yönteme yapılan çağrıları kesme aracı yöntemine yapılan çağrılarla değiştirir.

Interceptörlerle denemeler yapmayı düşünüyorsanız, özellik belirtiminiokuyarak 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.