Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
struct
durumunda, 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.
..e
bir 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:
-
int[]
gibi dizi türleri. - System.Span<T> ve System.ReadOnlySpan<T>.
- System.Collections.Generic.List<T>gibi koleksiyon başlatıcılarını destekleyen türler.
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:
-
in
kullanılmadan önce oluşturulan API'ler, bağımsız değişken değiştirilmese bileref
kullanabilir. Bu API'lerref readonly
ile güncelleştirilebilir. Arayanlar için,ref
parametresininin
olarak değiştirilmesi durumunda olacağı gibi uyumsuzluk yaratacak bir değişiklik olmayacaktır. Örneklerden biri System.Runtime.InteropServices.Marshal.QueryInterface. -
in
parametresini alıp mantıksal olarak değişken gerektiren API'ler. Değer ifadesi çalışmaz. Örneğin System.ReadOnlySpan<T>.ReadOnlySpan<T>(T). - Değişken gerektirdiği halde bu değişkenleri değiştirmeyen
ref
kullanan API'ler. Örneğin System.Runtime.CompilerServices.Unsafe.IsNullRef.
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 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. 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.
- .NET 8'deki yenilikler