Aracılığıyla paylaş


C# 14'teki yenilikler

C# 14 aşağıdaki yeni özellikleri içerir. En son Visual Studio 2022 sürümünü veya .NET 10 SDK'sını kullanarak bu özellikleri deneyebilirsiniz:

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

En son .NET 10 SDK'sını .NET indirmeleri sayfasından indirebilirsiniz. .NET 10 SDK'sını içeren Visual Studio 2022'yi de indirebilirsiniz.

Yeni özellikler genel önizleme sürümlerinde kullanıma sunulduğunda "C#'daki yenilikler" sayfasına eklenir. Roslyn özellik durumu sayfasının çalışma kümesi bölümü, yaklaşmakta olan özelliklerin ana dala ne zaman birleştirildiğini izler. Bu makale en son .NET 10 Preview 1 için güncelleştirildi.

C# 14'te sunulan hataya neden olan değişiklikleri hataya neden olan değişiklikler hakkındaki makalemizde bulabilirsiniz.

Uyarı

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

Eklenti üyeleri

C# 14 , uzantı üyelerini tanımlamak için yeni söz dizimi ekler. Yeni söz dizimi, uzantı yöntemlerine ek olarak uzantı özelliklerini bildirmenizi sağlar. Ayrıca, türün bir örneği yerine türü genişleten uzantı üyelerini bildirebilirsiniz. Başka bir deyişle, bu yeni uzantı üyeleri genişletdiğiniz türün statik üyeleri olarak görünebilir. Aşağıdaki kod örneği, bildirebileceğiniz farklı uzantı üyesi türlerinin bir örneğini gösterir:

public static class Enumerable
{
    // Extension block
    extension<TSource>(IEnumerable<TSource> source) // extension members for IEnumerable<TSource>
    {
        // Extension property:
        public bool IsEmpty => !source.Any();
        // Extension indexer:
        public TSource this[int index] => source.Skip(index).First();

        // Extension method:
        public IEnumerable<TSource> Where(Func<TSource, bool> predicate) { ... }
    }

    // extension block, with a receiver type only
    extension<TSource>(IEnumerable<TSource>) // static extension members for IEnumerable<Source>
    {
        // static extension method:
        public static IEnumerable<TSource> Combine(IEnumerable<TSource> first, IEnumerable<TSource> second) { ... }

        // static extension property:
        public static IEnumerable<TSource> Identity => Enumerable.Empty<TSource>();
    }
}

İlk uzantı bloğundaki üyeler, örneğin IEnumerable<TSource>, sequence.IsEmpty'ün örnek üyeleriymiş gibi çağrılır. İkinci uzantı bloğundaki üyeler, IEnumerable<TSource>'ün statik üyeleriymiş gibi çağrılır, örneğin IEnumerable<int>.Identity.

Programlama kılavuzunda uzantı üyeleriyle ilgili makaleyi, anahtar sözcükle ilgiliextension dil başvuru makalesini ve yeni uzantı üyeleri özelliğinin özellik belirtimini okuyarak daha fazla ayrıntı öğrenebilirsiniz.

field anahtar sözcüğü

Belirteç field , belirgin bir arka plan alanı bildirmeden bir özellik erişimci metni yazmanızı sağlar. Belirteç field , derleyici tarafından sentezlenen bir yedekleme alanıyla değiştirilir.

Örneğin, önceden bir string özelliğin null olarak ayarlanamayacağından emin olmak istiyorsanız, bir arka plan alanı bildirmeniz ve her iki erişimciyi de uygulamanız gerekiyordu.

private string _msg;
public string Message
{
    get => _msg;
    set => _msg = value ?? throw new ArgumentNullException(nameof(value));
}

Artık kodunuzu şu şekilde basitleştirebilirsiniz:

public string Message
{
    get;
    set => field = value ?? throw new ArgumentNullException(nameof(value));
}

Alan destekli bir özellik için erişimcilerden biri veya her ikisi için gövde bildirebilirsiniz.

field adlı bir simgeyi de içeren türlerde, kod okumada uyumluluk bozucu bir değişiklik veya karışıklık potansiyeli vardır. @field veya this.field kullanarak anahtar sözcük field ile tanımlayıcı arasında ayrım yapabilirsiniz veya mevcut field simgeyi daha iyi ayırt edebilmek için yeniden adlandırabilirsiniz.

Eğer bu özelliği dener ve geri bildiriminiz olursa, deposundaki csharplang üzerine yorum yapabilirsiniz.

field bağlamsal anahtar sözcüğü, önizleme özelliği olarak C# 13'tedir.

Örtük span dönüşümleri

C# 14, dilde System.Span<T> ve System.ReadOnlySpan<T> için birinci sınıf destek tanıtıyor. Bu destek, bu türlerle daha doğal programlamaya olanak sağlayan yeni örtük dönüştürmeleri içerir.

Span<T> ve ReadOnlySpan<T> C# ve çalışma zamanında birçok önemli şekilde kullanılır. Tanıtımları, güvenliği riske atmadan performansı artırır. C# 14, ReadOnlySpan<T>, Span<T> ve T[] arasındaki ilişkiyi tanır ve bazı dönüştürmeleri destekler. Span türleri, uzantı yöntemi alıcıları olabilir, diğer dönüştürmelerle birleştirilerek kullanılabilir ve genel tür çıkarım senaryolarını destekleyebilir.

Dil referans bölümündeki yerleşik türler makalesinde, örtük span dönüşümlerinin listesini bulabilirsiniz. First class span türleri için özellik belirtimini okuyarak daha fazla ayrıntı öğrenebilirsiniz.

Sınırsız genel türler ve nameof

C# 14 ile başlayarak, nameof için argüman bağlanmamış bir genel tür olabilir. Örneğin, nameof(List<>), List olarak değerlendirilir. C#'ın önceki sürümlerinde, sadece List<int> gibi kapalı genel türler adı döndürmek için List kullanılabilirdi.

Değiştiricileri olan basit lambda parametreleri

Parametre türünü belirtmeden lambda ifade parametrelerine , scoped, ref, inveya out gibi ref readonlyparametre değiştiricileri ekleyebilirsiniz:

delegate bool TryParse<T>(string text, out T result);
// ...
TryParse<int> parse1 = (text, out result) => Int32.TryParse(text, out result);

Daha önce, değiştiricilerin eklenmesine yalnızca parametre bildirimleri parametrelerin türlerini içerdiğinde izin veriliyordu. Yukarıdaki bildirim tüm parametrelerde türler gerektirir:

TryParse<int> parse2 = (string text, out int result) => Int32.TryParse(text, out result);

Değiştirici params yine de açıkça yazılan bir parametre listesi gerektirir.

C# dil başvurusundaki lambda ifadeleri makalesinde bu değişiklikler hakkında daha fazla bilgi edinebilirsiniz.

Daha fazla kısmi üye

Artık örnek oluşturucularını ve olaylarınıkısmi üye olarak bildirebilirsiniz.

Kısmi oluşturucular ve kısmi olaylar tam olarak bir tanımlama bildirimi ve bir uygulayan bildirimi içermelidir.

Yalnızca kısmi bir oluşturucunun uygulama bildirimi bir oluşturucu başlatıcı içerebilir: this() veya base(). Yalnızca bir kısmi tür bildirimi birincil oluşturucu söz dizimini içerebilir.

Kısmi bir olayın uygulama bildirimi, add ve remove erişimcilerini içermelidir. Tanımlayıcı bildirimi alan benzeri bir olay bildirir.

Kullanıcı tanımlı bileşik atama

Kullanıcı tanımlı bileşik atama için özellik belirtiminde daha fazla bilgi edinebilirsiniz.

Null koşullu atama

Null koşullu üye erişim işleçleri ?. ve ?[], artık atamanın veya bileşik atamanın sol tarafında kullanılabilir.

C# 14'ten önce, bir özelliğe atama yapmadan önce bir değişkeni null olarak denetlemeniz gerekiyordu.

if (customer is not null)
{
    customer.Order = GetCurrentOrder();
}

yukarıdaki kodu işlecini ?. kullanarak basitleştirebilirsiniz:

customer?.Order = GetCurrentOrder();

İşlecin sağ tarafı = yalnızca sol taraf null olmadığında değerlendirilir. Eğer customer null ise, kod GetCurrentOrder çağrısı yapmaz.

Atamaya ek olarak, bileşik atama işleçleri (+=, -=ve diğerleri) ile null koşullu üye erişim işleçleri kullanabilirsiniz. Ancak, artım ve azaltma, ++ ve -- için izin verilmez.

Koşullu üye erişimi ve null koşullu atama için özellik tanımı hakkındaki dil referans makalesinde daha fazla bilgi edinebilirsiniz.

Ayrıca bkz.