C# dili C# 8'dən bəri böyük dəyişikliklər yaşayıb. Hər yeni versiya (9, 10, 11, 12, 13) üç əsas mövzuya fokuslanıb: qısalıq (daha az kodla eyni mənanı ifadə etmək), təhlükəsizlik (səhvləri iş vaxtı yox, kompilyasiya zamanı tutmaq) və performans (tərtibatçılara aşağı səviyyəli nəzarət imkanı vermək). Bu yazıda gündəlik inkişafda ən çox işə yarayan xüsusiyyətləri nəzərdən keçirəcəyik.
Records — bir sətirlə immutable data model
C# 9 ilə gələn record tipləri dəyişməz (immutable) və dəyər əsaslı (value-based) data modelləri yaratmağı çox asanlaşdırır. Əvvəllər hər dəfə konstruktor, Equals, GetHashCode və ToString metodlarını əl ilə yazmalı idiniz. İndi isə tək sətir kifayətdir: public record Person(string FirstName, string LastName);. Bu sizə avtomatik olaraq dəyər əsaslı bərabərlik, oxunaqlı ToString, dekonstruktor və with ifadəsi ilə kopyalama imkanı verir. Record strukturları (C# 10) isə yığın üzərində işləyir və heç bir heap allocasiyası tələb etmir.
Pattern Matching — şərtləri daha oxunaqlı yazmaq
Pattern matching artıq sadə is operatorundan çıxıb tam bir ifadə dilinə çevrilib. switch ifadələri ilə mürəkkəb şərtləri çox qısa və oxunaqlı şəkildə yazmaq mümkündür. Məsələn, order switch { Order { Total: > 100, IsPriority: true } => 0m, ... } kimi nümunələr çox yayılıb. List pattern-lər (C# 11) isə massivlərin formasını və məzmununu birbaşa yoxlamağa imkan verir: məsələn, [var first, .., var last] ilə ilk və son elementləri çıxarmaq olar.
Async/Await təkmilləşdirmələri və LINQ yenilikləri
IAsyncEnumerable<T> (C# 8) sayəsində böyük faylları yaddaşa yükləmədən sətir-sətir oxumaq mümkündür. ValueTask<T> isə sinxron tamamlanan əməliyyatlarda Task allocasiyasının qarşısını alır. Task.WaitAsync (C# 10) ilə asinxron əməliyyatlara vaxt limiti qoymaq asanlaşıb. LINQ tərəfdə isə .NET 6 ilə Chunk, MinBy, MaxBy, DistinctBy kimi yeni operatorlar əlavə olunub. C# 13'də Index() metodu ilə hər elementin indeksini ayrıca sayğac saxlamadan əldə etmək olar.
Span<T> və performans optimallaşdırmaları
Span<T> (C# 7.2) yaddaşın bir hissəsini kopyalamadan işləməyə imkan verir. Məsələn, sətirdən alt sətir götürmək üçün Substring əvəzinə Span.Slice istifadə etmək yeni string allocasiyasının qarşısını alır. Bundan başqa, C# 11'də generic math (istənilən ədəd növü ilə işləyən ümumi alqoritmlər), required members (konstruktor olmadan property-lərin məcburi təyin olunması) və C# 12'də collection expressions (massiv, siyahı və span-ların vahid sintaksisi) kimi xüsusiyyətlər gəlib. Bütün bunlar bir arada .NET-in ümumi performansını artırır və kodun yazılmasını sürətləndirir.
Yekun olaraq qeyd edək ki, müasir C# həm ifadəli, həm də yüksək performanslı bir dilə çevrilib. Records və pattern matching ilə qısalıq, nullable reference types ilə təhlükəsizlik, Span<T> və generic math ilə isə aşağı səviyyəli optimallaşdırma imkanları təmin edilir. Bu yenilikləri izləmək hər bir .NET tərtibatçısı üçün faydalıdır, çünki hər yeni versiya ilə runtime və BCL də təkmilləşir.



