Aracılığıyla paylaş


C# 13'teki yenilikler

C# 13 aşağıdaki yeni özellikleri içerir. En son Visual Studio 2022 sürümünü veya .NET 9 SDKkullanarak bu özellikleri deneyebilirsiniz:

Visual Studio 17.12'de başlayan C# 13, önizleme özelliği olarak field bağlamsal anahtar sözcüğü içerir.

C# 13, .NET 9üzerinde desteklenir. Daha fazla bilgi için bkz. C# dili sürüm oluşturma.

en son .NET 9 SDK'sını .NET indirmeleri sayfasındanindirebilirsiniz. .NET 9 SDK'sını içeren Visual Studio 2022de 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şan özelliklerin ana dala ne zaman birleştirildiğinden.

C# 13'te yapılan önemli değişiklikleri önemli değişiklikler makalemizde bulabilirsiniz.

Not

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

params koleksiyonları

params değiştirici dizi türleriyle sınırlı değildir. artık System.Span<T>, System.ReadOnlySpan<T>ve System.Collections.Generic.IEnumerable<T> uygulayan ve Add yöntemi olan türler de dahil olmak üzere tanınan herhangi bir koleksiyon türüyle params kullanabilirsiniz. Somut türlere ek olarak, System.Collections.Generic.IEnumerable<T>, System.Collections.Generic.IReadOnlyCollection<T>, System.Collections.Generic.IReadOnlyList<T>, System.Collections.Generic.ICollection<T>ve System.Collections.Generic.IList<T> arabirimleri de kullanılabilir.

Bir arabirim türü kullanıldığında, derleyici sağlanan bağımsız değişkenler için depolamayı sentezler. params koleksiyonları için özellik belirtimihakkında daha fazla bilgi edinebilirsiniz.

Örneğin, yöntem bildirimleri span'leri params parametreleri olarak bildirebilir:

public void Concat<T>(params ReadOnlySpan<T> items)
{
    for (int i = 0; i < items.Length; i++)
    {
        Console.Write(items[i]);
        Console.Write(" ");
    }
    Console.WriteLine();
}

Yeni kilit nesnesi

.NET 9 çalışma zamanı, iş parçacığı eşitlemesi için yeni bir tür olan System.Threading.Lock türünü içerir. Bu tür, API aracılığıyla daha iyi iş parçacığı senkronizasyonu sağlar. Lock.EnterScope() yöntemi özel bir kapsama girer. tarafından döndürülen ref struct, özel kullanım kapsamından çıkmak için Dispose() desenini destekler.

C# lock deyimi, kilidin hedefinin Lock bir nesne olup olmadığını tanır. Bu durumda, System.Threading.Monitorkullanan geleneksel API yerine güncelleştirilmiş API'yi kullanır. Derleyici ayrıca bir Lock nesnesini başka bir türe dönüştürdüğünüzde Monitor tabanlı kodun oluşturulacağını da tanır. yenikilit nesnesinin özellik belirtiminde daha fazla bilgi edinebilirsiniz.

Bu özellik, locknesne türünü değiştirerek yeni kitaplık türünün avantajlarından yararlanmanızı sağlar. Başka hiçbir kodun değişmesi gerekmez.

Yeni kaçış dizisi

ESCAPE karakteri, Unicode U+001Biçin karakter sabiti kaçış dizisi olarak \e kullanabilirsiniz. Daha önce \u001b veya \x1bkullandınız. \x1b kullanılması önerilmez çünkü 1b'den sonraki karakterler geçerli onaltılık basamaklarsa, bu karakterler kaçış dizisinin bir parçası haline gelir.

Yöntem grubu doğal türü

Bu özellik, yöntem gruplarını içeren çözümlemeyi aşırı yüklemek için küçük iyileştirmeler yapar. yöntem grubu bir yöntemdir ve tüm aşırı yüklemeler aynı ada sahip olur. Önceki davranış, derleyicinin bir yöntem grubu için aday yöntemlerin tam kümesini oluşturmasıydı. Doğal bir türe ihtiyaç duyulduysa, doğal tür aday yöntemlerin tam kümesinden belirlendi.

Yeni davranış, her kapsamdaki aday yöntemleri kümesini ayıklamak ve geçerli olmayan aday yöntemlerini kaldırmaktır. Genellikle, kaldırılan yöntemler yanlış 'arity' değerine veya karşılanamayan kısıtlamalara sahip 'generic' yöntemlerdir. İşlem, yalnızca hiçbir aday yöntemi bulunamazsa sonraki dış kapsama devam eder. Bu işlem, aşırı yükleme çözümlemesi için genel algoritmayı daha yakından izler. Belirli bir kapsamda bulunan tüm aday yöntemleri eşleşmiyorsa, yöntem grubunun doğal bir türü yoktur.

teklif spesifikasyonundaki değişikliklerin ayrıntılarınıokuyabilirsiniz.

Örtük dizin erişimi

^örtük "sondan" dizin işlecine artık nesne başlatıcı ifadesinde izin verilir. Örneğin, artık aşağıdaki kodda gösterildiği gibi bir nesne başlatıcıda bir dizi başlatabilirsiniz:

public class TimerRemaining
{
    public int[] buffer { get; set; } = new int[10];
}

var countdown = new TimerRemaining()
{
    buffer =
    {
        [^1] = 0,
        [^2] = 1,
        [^3] = 2,
        [^4] = 3,
        [^5] = 4,
        [^6] = 5,
        [^7] = 6,
        [^8] = 7,
        [^9] = 8,
        [^10] = 9
    }
};

TimerRemaining sınıfı, 10 uzunluğunda başlatılan bir buffer dizisi içerir. Yukarıdaki örnek, "bitişten" dizin işlecini (^) kullanarak değerleri bu diziye atar ve 9'dan 0'a kadar sayan bir dizi oluşturur.

C# 13'ün önceki sürümlerinde, ^ işleci bir nesne başlatıcıda kullanılamaz. Öğeleri ön taraftan dizine eklemeniz gerekir.

ref ve unsafe yineleyicilerde ve async yöntemlerinde

Bu özellik ve aşağıdaki iki özellik, ref struct türlerinin yeni yapıları kullanmasını sağlar. Kendi ref struct türlerinizi yazmadığınız sürece bunları kullanamazsınız. Büyük olasılıkla, System.Span<T> ve System.ReadOnlySpan<T> daha fazla işlev kazandıkça dolaylı bir fayda fark edebilirsiniz.

C# 13'e geçmeden önce yineleyici yöntemler (yield returnkullanan yöntemler) ve async yöntemler yerel ref değişkenlerini bildiremez ve unsafe bağlamlarına sahip olamaz.

C# 13'te, async yöntemleri ref yerel değişkenleri veya ref struct türündeki yerel değişkenleri bildirebilir. Ancak bu değişkenlere bir await sınırı üzerinden erişilemiyor. yield return sınırında bunlara da erişilemiyor.

Bu gevşetme kısıtlaması, derleyicinin ref yerel değişkenlerin ve ref struct türlerinin daha fazla yerde doğrulanabilir şekilde güvenli bir şekilde kullanılmasına izin vermesine olanak tanır. Bu yöntemlerde System.ReadOnlySpan<T> gibi türleri güvenle kullanabilirsiniz. Derleyici, güvenlik kurallarını ihlal ederseniz size bildirir.

Aynı şekilde, C# 13 yineleyici yöntemlerinde unsafe bağlamlara izin verir. Ancak, tüm yield return ve yield break deyimleri güvenli bağlamlarda olmalıdır.

allows ref struct

C# 13'te ref struct türler genel bir tür veya yöntem için tür bağımsız değişkeni olarak bildirilemedi. Artık genel tür bildirimleri allows ref structbir kısıtlamadan koruma ekleyebilir. Bu anti-kısıtlama, tür parametresi için verilen tür bağımsız değişkeninin bir ref struct türü olabileceğini belirtir. Derleyici, bu tür parametrenin tüm örneklerinde referans güvenliği kurallarını uygular.

Örneğin, aşağıdaki koda benzer genel bir tür bildirebilirsiniz:

public class C<T> where T : allows ref struct
{
    // Use T as a ref struct:
    public void M(scoped T p)
    {
        // The parameter p must follow ref safety rules
    }
}

Bu, System.Span<T> ve System.ReadOnlySpan<T> gibi türlerin uygun olduğunda genel algoritmalarla kullanılmasını sağlar. where güncelleştirmeleri ve genel kısıtlamalarıhakkında programlama kılavuzu makalesinde daha fazla bilgi edinebilirsiniz.

ref struct arabirimleri

C# 13'ten önce, ref struct türlerinin arabirimleri uygulamasına izin verilmezdi. C# 13'le başlayarak, bunu yapabilir. bir ref struct türünün bir arabirim uyguladığını bildirebilirsiniz. Ancak, ref güvenlik kurallarını sağlamak için, ref struct türünün bir arabirim türüne dönüştürülmesi mümkün değildir. Bu dönüştürme bir boxlama dönüştürmesidir ve referans güvenliğini ihlal edebilir. Bir ref struct açık arabirim yöntemi bildirimlerine yalnızca o tür parametresinin allows ref structolduğu bir tür parametresi aracılığıyla erişilebilir. Ayrıca ref struct türleri, varsayılan uygulama içeren yöntemler de dahil olmak üzere bir arabirimde bildirilen tüm yöntemleri uygulamalıdır.

ref struct türleri ve allows ref struct genel kısıtlamasının eklenmesi güncellemeleri hakkında daha fazla bilgi edinin.

Daha fazla kısmi üye

C# 13'te partial özellikleri ve partial dizin oluşturucuları bildirebilirsiniz. Kısmi özellikler ve dizin oluşturucular genellikle partial yöntemleriyle aynı kuralları izler: bildirim bildirim ve bildirim uygulayan biroluşturursunuz. İki bildirimin imzaları eşleşmelidir. Bir kısıtlama, kısmi bir özellik uygulayan için otomatik özellik bildirimini kullanamamanızdır. Bir gövde bildirmeyen özellikler, olarak kabul edilirbildirim.

public partial class C
{
    // Declaring declaration
    public partial string Name { get; set; }
}

public partial class C
{
    // implementation declaration:
    private string _name;
    public partial string Name
    {
        get => _name;
        set => _name = value;
    }
}

kısmi üyeler hakkındakimakalesinde daha fazla bilgi edinebilirsiniz.

Aşırı yükleme çözümleme önceliği

C# 13'te derleyici, bir aşırı yüklemeyi diğerine tercih etmek için OverloadResolutionPriorityAttribute tanır. Kitaplık yazarları, mevcut aşırı yükleme yerine yeni ve daha iyi bir aşırı yüklemenin tercih edilmesini sağlamak için bu özniteliği kullanabilir. Örneğin, daha yüksek performanslı yeni bir aşırı yükleme ekleyebilirsiniz. Kitaplığınızı kullanan mevcut kodu bozmak istemezsiniz, ancak kullanıcıların yeniden derleme yaptıklarında yeni sürüme güncelleştirmelerini istersiniz. Derleyiciye hangi aşırı yüklemenin tercih edilmesi gerektiğini bildirmek için Aşırı yükleme çözümleme önceliği kullanabilirsiniz. En yüksek önceliğe sahip aşırı yüklemeler tercih edilir.

Bu özellik, yeni aşırı yüklemeler eklerken belirsizliği önlemek için kitaplık yazarlarına yöneliktir. Kitaplık yazarlarının karışıklığı önlemek için bu öznitelikle dikkatli olması gerekir.

field anahtar sözcüğü

field bağlamsal anahtar sözcüğü, önizleme özelliği olarak C# 13'tedir. Belirteç field, bir özellik erişimcisindeki derleyici tarafından oluşturulan geri plan alanına erişir. Tür bildiriminizde açık bir yedekleme alanı bildirmeden bir erişimci gövdesi yazmanızı sağlar. Alan destekli bir özellik için erişimcilerden biri veya her ikisi için gövde bildirebilirsiniz.

field özelliği önizleme özelliği olarak yayınlanır. Bunu kullanarak deneyimlerinizi öğrenmek istiyoruz. fieldadlı bir alanı da içeren türlerde kod okumada hataya neden olabilecek bir değişiklik veya karışıklık vardır. @field veya this.field kullanarak field anahtar sözcüğüyle tanımlayıcı arasında ayrım yapabilirsiniz.

Önemli

field anahtar sözcüğü, C# 13'teki bir önizleme özelliğidir. field bağlamsal anahtar sözcüğünü kullanmak için .NET 9 kullanıyor olmanız ve <LangVersion> öğenizi proje dosyanızda preview olarak ayarlamanız gerekir.

fieldadlı bir alana sahip bir sınıfta field anahtar sözcük özelliğini kullanırken dikkatli olmanız gerekir. Yeni field anahtar sözcüğü, özellik erişimcisi kapsamında field adlı bir alanı gölgeler. field değişkeninin adını değiştirebilir veya field tanımlayıcısına @fieldolarak başvurmak için @ belirtecini kullanabilirsiniz. field anahtar sözcüğü için özellik belirtimini okuyarak daha fazla bilgi edinebilirsiniz.

Bu özelliği dener ve geri bildirimde bulunmak isterseniz, geri bildiriminizi csharplang deposunda yer alan özellikle ilgili sorun'e ekleyin.

Ayrıca bkz.