C# 10'daki yenilikler

C# 10, C# diline aşağıdaki özellikleri ve geliştirmeleri ekler:

C# 10, .NET 6'da desteklenir. Daha fazla bilgi için bkz . C# dil sürümü oluşturma.

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

Kayıt yapıları

veya readonly record struct bildirimlerini kullanarak record struct değer türü kayıtlarını bildirebilirsiniz. Artık bildirimiyle record class a'nın record bir başvuru türü olduğunu netleştirebilirsiniz.

Yapı türleri geliştirmeleri

C# 10, yapı türleriyle ilgili aşağıdaki iyileştirmeleri sunar:

  • Yapı türünde bir örnek parametresiz oluşturucu bildirebilir ve bildirimde bir örnek alanı veya özelliği başlatabilirsiniz. Daha fazla bilgi için Yapı türleri makalesinin Yapı başlatma ve varsayılan değerler bölümüne bakın.
  • İfadenin with sol işleneni herhangi bir yapı türünde veya anonim (başvuru) türünde olabilir.

İlişkili dize işleyicisi

İlişkili bir dize ifadesinden elde edilen dizeyi oluşturan bir tür oluşturabilirsiniz. .NET kitaplıkları bu özelliği birçok API'de kullanır. Bu öğreticiyi izleyerek bir tane oluşturabilirsiniz.

Genel kullanım yönergeleri

Derleyiciye yönergenin derlemedeki global tüm kaynak dosyalar için geçerli olduğunu bildirmek için değiştiriciyi herhangi bir using yönergesine ekleyebilirsiniz. Bunlar genellikle bir projedeki tüm kaynak dosyalardır.

Dosya kapsamlı ad alanı bildirimi

Bildirimin namespace yeni bir biçimini kullanarak, aşağıdaki tüm bildirimlerin bildirilen ad alanının üyeleri olduğunu bildirebilirsiniz:

namespace MyNamespace;

Bu yeni söz dizimi, bildirimler için namespace hem yatay hem de dikey alandan tasarruf sağlar.

Genişletilmiş özellik desenleri

C# 10'da başlayarak, bir özellik deseni içindeki iç içe özelliklere veya alanlara başvurabilirsiniz. Örneğin, formun deseni

{ Prop1.Prop2: pattern }

C# 10 ve sonraki sürümlerde geçerlidir ve

{ Prop1: { Prop2: pattern } }

C# 8.0 ve sonraki sürümlerde geçerlidir.

Daha fazla bilgi için Bkz . Genişletilmiş özellik desenleri özellik teklifi notu. Özellik deseni hakkında daha fazla bilgi için Desenler makalesinin Özellik düzeni bölümüne bakın.

Lambda ifadesi geliştirmeleri

C# 10, lambda ifadelerinin nasıl işleneceğini gösteren birçok geliştirme içerir:

  • Lambda ifadeleri, derleyicinin lambda ifadesinden veya yöntem grubundan temsilci türü çıkarabildiği doğal bir türe sahip olabilir.
  • Derleyici çıkaramayınca Lambda ifadeleri bir dönüş türü bildirebilir.
  • Öznitelikler lambda ifadelerine uygulanabilir.

Bu özellikler lambda ifadelerini yöntemlere ve yerel işlevlere daha benzer hale getirir. Temsilci türünde bir değişken bildirmeden lambda ifadelerini kullanmayı kolaylaştırır ve yeni ASP.NET Temel Minimum API'lerle daha sorunsuz çalışırlar.

Sabit ilişkilendirilmiş dizeler

C# 10'da, const tüm yer tutucular kendilerinin sabit dizeleriyse dize ilişkilendirmesi kullanılarak dizeler başlatılabilir. Dize ilişkilendirmesi, uygulamanızda kullanılan sabit dizeler oluştururken daha okunabilir sabit dizeler oluşturabilir. Bu sabitler çalışma zamanında dizelere dönüştürüldüğünden yer tutucu ifadeler sayısal sabitler olamaz. Geçerli kültür, dize gösterimini etkileyebilir. İfadeler hakkındaki dil başvurusunda const daha fazla bilgi edinin.

Kayıt türleri ToString'i mühürleyebilir

C# 10'da, kayıt türünde geçersiz kıldığınızda ToString değiştiriciyi sealed ekleyebilirsiniz. yönteminin ToString mühürlenmesi, derleyicinin türetilmiş kayıt türleri için bir ToString yöntemi sentezlemesini engeller. A sealedToString , türetilmiş tüm kayıt türlerinin ToString ortak bir temel kayıt türünde tanımlanan yöntemi kullanmasını sağlar. Bu özellik hakkında daha fazla bilgiyi kayıt makalesinde bulabilirsiniz.

Aynı yapısızlaştırmada atama ve bildirim

Bu değişiklik, önceki C# sürümlerinden bir kısıtlamayı kaldırır. Daha önce, bir yapısızlaştırma tüm değerleri mevcut değişkenlere atayabilir veya yeni bildirilen değişkenleri başlatabilirdi:

// Initialization:
(int x, int y) = point;

// assignment:
int x1 = 0;
int y1 = 0;
(x1, y1) = point;

C# 10 bu kısıtlamayı kaldırır:

int x = 0;
(x, int y) = point;

İyileştirilmiş kesin atama

C# 10'dan önce, kesin atama ve null durum analizinin hatalı pozitif uyarılar ürettiği birçok senaryo vardı. Bunlar genellikle boole sabitleriyle karşılaştırmalar, yalnızca bir deyimdeki true veya false deyimlerindeki if bir değişkene erişme ve null birleşim ifadeleri içerir. Bu örnekler C# öğesinin önceki sürümlerinde uyarılar oluşturdu, ancak C# 10'da yok:

string representation = "N/A";
if ((c != null && c.GetDependentValue(out object obj)) == true)
{
   representation = obj.ToString(); // undesired error
}

// Or, using ?.
if (c?.GetDependentValue(out object obj) == true)
{
   representation = obj.ToString(); // undesired error
}

// Or, using ??
if (c?.GetDependentValue(out object obj) ?? false)
{
   representation = obj.ToString(); // undesired error
}

Bu geliştirmenin temel etkisi, kesin atama ve null durum analizine yönelik uyarıların daha doğru olmasıdır.

Yöntemlerde AsyncMethodBuilder özniteliğine izin ver

C# 10 ve sonraki sürümlerde, belirli bir görev benzeri tür döndüren tüm yöntemler için yöntem oluşturucu türünü belirtmeye ek olarak, tek bir yöntem için farklı bir zaman uyumsuz yöntem oluşturucu belirtebilirsiniz. Özel bir zaman uyumsuz yöntem oluşturucusu, belirli bir yöntemin özel oluşturucudan yararlanabileceği gelişmiş performans ayarlama senaryolarını etkinleştirir.

Daha fazla bilgi edinmek için derleyici tarafından okunan öznitelikler hakkındaki makalenin üzerindeki AsyncMethodBuilder bölümüne bakın.

CallerArgumentExpression öznitelik tanılaması

derleyicinin System.Runtime.CompilerServices.CallerArgumentExpressionAttribute yerine başka bir bağımsız değişkenin metin gösterimini koyacak bir parametre belirtmek için kullanabilirsiniz. Bu özellik kitaplıkların daha belirli tanılamalar oluşturmasını sağlar. Aşağıdaki kod bir koşulu test ediyor. Koşul false ise, özel durum iletisi öğesine geçirilen bağımsız değişkenin metin gösterimini conditioniçerir:

public static void Validate(bool condition, [CallerArgumentExpression("condition")] string? message=null)
{
    if (!condition)
    {
        throw new InvalidOperationException($"Argument failed validation: <{message}>");
    }
}

Dil başvurusu bölümündeki Arayan bilgileri öznitelikleri makalesinde bu özellik hakkında daha fazla bilgi edinebilirsiniz.

Gelişmiş #line pragması

C# 10, pragma için #line yeni bir biçimi destekler. Büyük olasılıkla yeni biçimi kullanmayacaksınız, ancak etkilerini göreceksiniz. Geliştirmeler, Razor gibi etki alanına özgü dillerde (DLL) daha ayrıntılı çıkış sağlar. Razor altyapısı, hata ayıklama deneyimini geliştirmek için bu geliştirmeleri kullanır. Hata ayıklayıcıların Razor kaynağınızı daha doğru vurgulayabildiğini göreceksiniz. Yeni söz dizimi hakkında daha fazla bilgi edinmek için dil başvurusundaki Önişlemci yönergeleri makalesine bakın. Razor tabanlı örneklerin özellik belirtimini de okuyabilirsiniz.