C# 11'deki yenilikler

C# 11'de aşağıdaki özellikler eklendi:

C# 11 , .NET 7'de desteklenir. Daha fazla bilgi için bkz . C# dil sürümü oluşturma.

En son .NET 7 SDK'sını .NET indirmeleri sayfasından indirebilirsiniz. .NET 7 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.

Genel öznitelikler

Temel sınıfı olan genel bir sınıfSystem.Attributebildirebilirsiniz. Bu özellik, parametre gerektiren öznitelikler için daha kullanışlı bir System.Type söz dizimi sağlar. Daha önce oluşturucu parametresi olarak alan bir Type öznitelik oluşturmanız gerekirdi:

// Before C# 11:
public class TypeAttribute : Attribute
{
   public TypeAttribute(Type t) => ParamType = t;

   public Type ParamType { get; }
}

Özniteliğini uygulamak için şu typeof işlecini kullanırsınız:

[TypeAttribute(typeof(string))]
public string Method() => default;

Bu yeni özelliği kullanarak, bunun yerine genel bir öznitelik oluşturabilirsiniz:

// C# 11 feature:
public class GenericAttribute<T> : Attribute { }

Ardından, özniteliğini kullanmak için tür parametresini belirtin:

[GenericAttribute<string>()]
public string Method() => default;

özniteliğini uygularken tüm tür parametrelerini sağlamanız gerekir. Başka bir deyişle, genel tür tam olarak oluşturulmalıdır. Yukarıdaki örnekte, özniteliğin bağımsız değişkeni olmadığından boş parantezler (( ve )) atlanabilir.

public class GenericType<T>
{
   [GenericAttribute<T>()] // Not allowed! generic attributes must be fully constructed types.
   public string Method() => default;
}

Tür bağımsız değişkenleri işleciyle aynı kısıtlamaları karşılamalıdır typeof . Meta veri ek açıklamaları gerektiren türlere izin verilmez. Örneğin, tür parametresi olarak aşağıdaki türlere izin verilmez:

  • dynamic
  • string? (veya boş değer atanabilir herhangi bir başvuru türü)
  • (int X, int Y) (veya C# tanımlama grubu söz dizimi kullanan diğer tanımlama grubu türleri).

Bu türler meta verilerde doğrudan temsil edilir. Türü açıklayan ek açıklamalar içerir. Her durumda, bunun yerine temel alınan türü kullanabilirsiniz:

  • object için dynamic.
  • string yerine string?.
  • ValueTuple<int, int> yerine (int X, int Y).

Genel matematik desteği

Genel matematik desteğini etkinleştiren çeşitli dil özellikleri vardır:

  • static virtual arabirimlerdeki üyeler
  • denetlenen kullanıcı tanımlı işleçler
  • rahat vardiya işleçleri
  • unsigned right-shift işleci

Aşırı yüklenebilir işleçler, diğer statik üyeler ve statik özellikler içeren arabirimleri tanımlamak için arabirimlere veya static virtual üyeleri ekleyebilirsinizstatic abstract. Bu özelliğin birincil senaryosu, matematiksel işleçleri genel türlerde kullanmaktır. Örneğin, arabirimini System.IAdditionOperators<TSelf, TOther, TResult> uygulayan bir türde uygulayabilirsiniz operator +. Diğer arabirimler diğer matematiksel işlemleri veya iyi tanımlanmış değerleri tanımlar. Arabirimlerle ilgili makalede yeni söz dizimi hakkında bilgi edinebilirsiniz. Yöntemleri içeren static virtual arabirimler genellikle genel arabirimlerdir. Ayrıca, çoğu tür parametresinin bildirilen arabirimi uygulayacağı bir kısıtlama bildirir.

Statik soyut arabirim üyelerini keşfetme öğreticisinde veya .NET 6'daki Önizleme özellikleri – genel matematik blog gönderisinde daha fazla bilgi edinebilir ve özelliği kendiniz deneyebilirsiniz.

Genel matematik, dilde başka gereksinimler oluşturmuştur.

  • unsigned right shift işleci: C# 11'den önce, imzasız bir sağ kaydırmayı zorlamak için, imzalı tamsayı türlerini imzasız bir türe atamanız, vardiyayı gerçekleştirmeniz ve ardından sonucu imzalı bir türe geri dönüştürmeniz gerekir. C# 11'de başlayarak, işaretsiz shift işlecini kullanabilirsiniz.>>>
  • esnek vardiya işleci gereksinimleri: C# 11, ikinci işlenenin veya örtük olarak dönüştürülebilir olması int gereksinimini intortadan kaldırır. Bu değişiklik, genel matematik arabirimlerini uygulayan türlerin bu konumlarda kullanılmasını sağlar.
  • işaretli ve işaretsiz kullanıcı tanımlı işleçler: Geliştiriciler artık ve unchecked aritmetik işleçler tanımlayabilirchecked. Derleyici, geçerli bağlama göre doğru değişkene çağrılar oluşturur. Aritmetik işleçler makalesinde işleçler hakkında daha fazla bilgi checked edinebilirsiniz.

Sayısal IntPtr ve UIntPtr

nint ve nuint artık sırasıyla diğer ad System.IntPtr ve System.UIntPtrtürleridir.

Dize ilişkilendirmelerindeki yeni satırlar

Dize ilişkilendirmesi için ve } karakterlerinin { içindeki metin artık birden çok satıra yayılabilir. ve } işaretçileri arasındaki { metin C# olarak ayrıştırılır. Yeni satırlar da dahil olmak üzere tüm yasal C#'lere izin verilir. Bu özellik, desen eşleştirme switch ifadeleri veya LINQ sorguları gibi daha uzun C# ifadeleri kullanan dize ilişkilendirmelerini okumayı kolaylaştırır.

Dil başvurusundaki dize ilişkilendirmeleri makalesinde yeni satırlar özelliği hakkında daha fazla bilgi edinebilirsiniz.

Liste desenleri

Liste desenleri , desen eşleştirmeyi bir listedeki veya dizideki öğelerin dizileriyle eşleşecek şekilde genişletir. Örneğin, sequence is [1, 2, 3]true üç tamsayının (1, 2 ve 3) bir dizisi veya listesi olduğunda sequence değeridir. Sabit, tür, özellik ve ilişkisel desenler dahil olmak üzere herhangi bir desen kullanarak öğeleri eşleştirebilirsiniz. Atma deseni (_) tek bir öğeyle, yeni aralık deseni (..) ise sıfır veya daha fazla öğe dizisiyle eşleşir.

Dil başvurusundaki desen eşleştirme makalesinde liste desenleri hakkında daha fazla bilgi edinebilirsiniz.

Temsilciye geliştirilmiş yöntem grubu dönüştürme

Yöntem grubu dönüştürmelerindeki C# standardı artık aşağıdaki öğeyi içerir:

  • Dönüştürmenin bu başvuruları içeren mevcut bir temsilci örneğini kullanmasına izin verilir (ancak gerekli değildir).

Standardın önceki sürümleri, derleyicinin bir yöntem grubu dönüştürmesi için oluşturulan temsilci nesnesini yeniden kullanmasını yasaklamıştır. C# 11 derleyicisi, bir yöntem grubu dönüştürme işleminden oluşturulan temsilci nesnesini önbelleğe alır ve bu tek temsilci nesnesini yeniden kullanır. Bu özellik ilk olarak Visual Studio 2022 sürüm 17.2'de önizleme özelliği olarak ve .NET 7 Preview 2'de kullanılabilir.

Ham dize değişmez değerleri

Ham dize değişmez değerleri , dize değişmez değerleri için yeni bir biçimdir. Ham dize değişmez değerleri boşluk, yeni satırlar, eklenmiş tırnak işaretleri ve kaçış dizileri gerektirmeden diğer özel karakterler de dahil olmak üzere rastgele metinler içerebilir. Ham dize değişmez değeri en az üç çift tırnak (""") karakteriyle başlar. Aynı sayıda çift tırnak karakteriyle biter. Ham dize değişmez değeri genellikle dizeyi başlatmak için tek bir satırda üç çift tırnak ve dizeyi sonlandırmak için ayrı bir satırda üç çift tırnak kullanır. Açılış teklifinden sonra gelen ve kapanış teklifinden önceki yeni satırlar son içeriğe dahil değildir:

string longMessage = """
    This is a long message.
    It has several lines.
        Some are indented
                more than others.
    Some should start at the first column.
    Some have "quoted text" in them.
    """;

Kapanış çift tırnaklarının solundaki herhangi bir boşluk dize değişmez değerden kaldırılır. Ham dize değişmez değerleri, çıkış metnine ayraç eklemek için dize ilişkilendirmesiyle birleştirilebilir. Birden çok $ karakter, kaç ardışık ayraç başlatılıp ilişkilendirmenin sona ereceğini belirtir:

var location = $$"""
   You are at {{{Longitude}}, {{Latitude}}}
   """;

Yukarıdaki örnek, iki küme ayracının bir ilişkilendirmeyi başlatıp sonlandırdığını belirtir. Üçüncü yinelenen açma ve kapatma ayracı çıkış dizesine eklenir.

Programlama kılavuzundaki dizelerle ilgili makalede ham dize değişmez değerleri hakkında daha fazla bilgi edinebilir ve dize değişmez değerleri ve ilişkilendirilmiş dizeler hakkındaki dil başvuru makaleleri hakkında daha fazla bilgi edinebilirsiniz.

Otomatik varsayılan yapı

C# 11 derleyicisi, bir oluşturucuyu yürütmenin bir parçası olarak bir struct türdeki tüm alanların varsayılan değerlerine başlatılmasını sağlar. Bu değişiklik, bir oluşturucu tarafından başlatılmayan tüm alan veya otomatik özelliklerin derleyici tarafından otomatik olarak başlatıldığı anlamına gelir. Oluşturucunun artık tüm alanları kesinlikle atamadığı ve açıkça başlatılmayan alanların varsayılan değerine ayarlandığı yapılar. Yapılarla ilgili makalede bu değişikliğin yapı başlatmayı nasıl etkilediği hakkında daha fazla bilgi edinebilirsiniz.

Desen eşleşmesi Span<char> veya ReadOnlySpan<char> sabitte string

Çeşitli sürümler için desen eşleştirmeyi kullanarak belirli string bir sabit değere sahip olup olmadığını test edebildiniz. Artık veya ReadOnlySpan<char>olan değişkenlerle Span<char> aynı desen eşleştirme mantığını kullanabilirsiniz.

Genişletilmiş kapsam adı

Tür parametre adları ve parametre adları artık bu yöntemdeki bir öznitelik bildirimindeki bir nameofifadede kullanıldığında kapsam dahilindedir. Bu özellik, yöntem veya parametre bildirimindeki nameof bir öznitelikte yöntem parametresinin adını belirtmek için işlecini kullanabileceğiniz anlamına gelir. Bu özellik çoğunlukla null atanabilir analiz için öznitelik eklemek için kullanışlıdır.

UTF-8 dize değişmez değerleri

UTF-8 karakter kodlamasını u8 belirtmek için dize değişmez değeri üzerinde son eki belirtebilirsiniz. Uygulamanızın HTTP dize sabitleri veya benzer metin protokolleri için UTF-8 dizelerine ihtiyacı varsa, UTF-8 dizelerinin oluşturulmasını basitleştirmek için bu özelliği kullanabilirsiniz.

Yerleşik başvuru türleriyle ilgili makalenin dize değişmez değerleri bölümünde UTF-8 dize değişmez değerleri hakkında daha fazla bilgi edinebilirsiniz.

Gerekli üyeler

Oluşturucuları required ve çağıranları bu değerleri başlatmaya zorlamak için değiştiriciyi özelliklere ve alanlara ekleyebilirsiniz. System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute oluşturucunun gerekli tüm üyeleri başlatdığını derleyiciye bildirmek için oluşturuculara eklenebilir.

Gerekli üyeler hakkında daha fazla bilgi için özellikler makalesinin yalnızca başlatma bölümüne bakın.

ref alanlar ve ref scoped değişkenler

içindeki ref structalanları bildirebilirsinizref. Bu, özel öznitelikler veya gizli iç türler olmadan gibi System.Span<T> türleri destekler.

Değiştiriciyi scoped herhangi bir ref bildirime ekleyebilirsiniz. Bu, başvurunun kaçabileceği kapsamı sınırlar.

Dosya yerel türleri

C# 11'de başlayarak, görünürlüğü bildirildiği kaynak dosyayla kapsamı belirlenmiş bir tür oluşturmak için erişim değiştiricisini kullanabilirsiniz file . Bu özellik, kaynak oluşturucu yazarlarının adlandırma çakışmalarını önlemelerine yardımcı olur. Bu özellik hakkında daha fazla bilgi edinmek için dil başvurusundaki dosya kapsamlı türler makalesine bakın.

Ayrıca bkz.