C# 10'daki yeniler

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

Ek özellikler önizleme modunda kullanılabilir. Bu özellikleri denemeniz ve bunlar hakkında geri bildirim göndermeniz teşvik edildi. Son sürümden önce değişebilirler. Bu özellikleri kullanmak için projenizin içinde olarak <LangVersion> Preview ayarlay gerekir. Bu makalenin devamlarında Genel öznitelikler hakkında bilgi bulabilirsiniz.

C# 10, .NET 6'da de destekleni. Daha fazla bilgi için bkz. C# dili sürümü.

.NET indirmeleri sayfasından en son .NET 6 SDK'larını indirebilirsiniz. .NET 6 SDK'Visual Studio 2022'dende indirebilirsiniz.

Kayıt yapılarını

veya bildirimlerini kullanarak değer türü kayıtları record struct readonly record struct bildirabilirsiniz. Artık bildirimiyle birlikte bir record başvuru türü olduğunu record class netleştirin.

Yapı türleri geliştirmeleri

C# 10, yapı türleriyle ilgili olarak aşağıdaki geliştirmeleri sağlar:

  • Bir yapı türünde parametresiz bir örnek oluşturucu bildirebilirsiniz ve bildiriminde bir örnek alanı veya özelliği başlatabilirsiniz. Daha fazla bilgi için Yapı türleri makalenin Parametresiz oluşturucular ve alan başlatıcılar bölümüne bakın.
  • İfadenin sol işleneni herhangi bir with yapı türünde veya anonim (başvuru) türünde olabilir.

İlişkili dize işleyicisi

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

Genel using yönergeleri

Derleyiciye, yönergenin derlemede tüm kaynak dosyaları için geçerli olduğunu yönergesini yönergesi için herhangi bir using global yönergesine eklersiniz. Bu genellikle bir proje içinde yer alan tüm kaynak dosyalardır.

Dosya kapsamlı ad alanı bildirimi

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

namespace MyNamespace;

Bu yeni söz dizimi, bildirimlerde yatay ve dikey namespace alandan tasarruf sağlar.

Genişletilmiş özellik desenleri

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

{ Prop1.Prop2: pattern }

C# 10 ve üzerinde geçerlidir ve ile eşdeğerdir

{ Prop1: { Prop2: pattern } }

C# 8.0 ve üzerinde geçerlidir.

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

Lambda ifadesi geliştirmeleri

C# 10, lambda ifadelerini işleme konusunda birçok geliştirme içerir:

  • Lambda ifadeleri, derleyicininlambda ifadesinde veya yöntem grubundan bir temsilci türü çıkarana doğal bir türüne sahip olabilir.
  • Lambda ifadeleri, derleyici tarafından çıkarılamay olduğunda bir dönüş türü bildir olabilir.
  • Öznitelikler lambda ifadelerine uygulanabilir.

Bu özellikler, lambda ifadelerini yöntemlere ve yerel işlevlere daha benzer hale sağlar. Bir temsilci türünde değişken bildirmeden lambda ifadelerinin kullanımını kolaylaştırır ve en az sayıda api'nin yeni ASP.NET Core çalışırlar.

Sabit irdelenmiş dizeler

C# 10'da, tüm yer tutucular sabit dizeler ise dize ilişkilendirme const kullanılarak dizeler başlatılmış olabilir. Uygulamanıza kullanılan sabit dizeler oluşturduktan sonra dize ilişkilendirmesi daha okunabilir sabit dizeler oluşturabilir. Bu sabitler çalışma zamanında dizelere dönüştürüldüklerinden yer tutucu ifadeleri sayısal sabitler olarak bulunamayabilirsiniz. Geçerli kültür, dize gösterimini etkileyebilir. İfadeler hakkında daha fazla bilgi için dil const başvurusuna bakın.

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

C# 10'da, bir kayıt türünde geçersiz sealed kılarak ToString değiştiriciyi ekleyin. Yöntemi ToString mühürleme, derleyicinin türetilmiş herhangi bir kayıt türü için ToString bir yöntemi sentezleyene engel olur. , sealed ToString türetilen tüm kayıt türlerinin ortak ToString bir temel kayıt türünde tanımlanan yöntemini kullanmalarını sağlar. Bu özellik hakkında daha fazla bilgi için kayıtlar makalesine bakın.

Aynı yok etmede atama ve bildirim

Bu değişiklik, önceki C# sürümlerinden bir kısıtlamayı kaldırır. Daha önce, bir yok etme tüm değerleri var olan değişkenlere atayarak veya yeni bildirilen değişkenleri başlatarak başlatmış olabilir:

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

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

C# 10 şu kısıtlamayı kaldırır:

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

İyileşmiş 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 sabitleri ile karşılaştırmaları içerir, yalnızca deyiminde veya deyimlerinde bir değişkene erişilir ve true false null birikerek if ifadeleri biriktirilir. Bu örnekler, önceki C# sürümlerinde uyarılar oluştursa da C# 10'da uyarı oluşturmaz:

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 ana etkisi, kesin atama ve null durum analizi uyarılarının daha doğru olmasıdır.

Yöntemlerde AsyncMethodBuilder özniteliğine izin ver

C# 10 ve sonraki bir içinde, belirli bir görev gibi türe dönüşen 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şturucu, belirtilen bir yöntemin özel bir oluşturucudan yararlanabilecek gelişmiş performans ayarlama senaryolarına olanak sağlar.

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

CallerArgumentExpression öznitelik tanılaması

Derleyicinin başka System.Runtime.CompilerServices.CallerArgumentExpressionAttribute bir bağımsız değişkenin metin gösterimiyle değiştirlediği 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 değerine geçirilen bağımsız değişkenin metin gösterimini condition iç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 Çağıran bilgileri öznitelikleri makalesinde bu özellik hakkında daha fazla bilgi edinebilirsiniz.

Gelişmiş #line pragma

C# 10 pragma için yeni bir #line biçimi destekler. Büyük olasılıkla yeni biçimi kullanmayabilirsiniz ancak etkilerini de görüyorsunuz. Geliştirmeler, Razor gibi etki alanına özgü dillerde (DSL) daha ince çıktı 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 bir şekilde vurgulay olduğunu bulabilirsiniz. Yeni söz dizimi hakkında daha fazla bilgi edinmek için dil başvurusunda Önişlemci yönergeleri makalesine bakın. Razor tabanlı örnekler için özellik belirtimini de okuyabilirsiniz.

Genel öznitelikler

Önemli

Genel öznitelikler bir önizleme özelliğidir. Bu özelliği etkinleştirmek <LangVersion> için Preview olarak ayarlayabilirsiniz. Bu özellik son sürümden önce değişebilir.

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

public class TypeAttribute : Attribute
{
   public TypeAttribute(Type t) => ParamType = t;

   public Type ParamType { get; }
}

özniteliğini uygulamak için işlecini typeof kullanırsiniz:

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

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

public class GenericAttribute<T> : Attribute { }

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

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

Tamamen kapalı oluşturulmuş bir genel öznitelik uygulayabilirsiniz. Başka bir deyişle, tüm tür parametreleri belirtilmelidir. Örneğin, aşağıdakilere izin verilmez:

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

Tür bağımsız değişkenleri işleciyle aynı kısıtlamaları typeof karşılamalı. Meta veri ek açıklamalarını gerektiren türlere izin verilmez. Örnekler şunlardır:

  • dynamic
  • nint, nuint
  • string? (veya herhangi bir boş değere değiştirilebilir başvuru türü)
  • (int X, int Y) (veya C# tuple söz dizimi kullanan diğer herhangi bir tuple türü).

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

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