زبان C# طی سه نسخهی اخیر خود یعنی C# 12، C# 13 و C# 14 همزمان با انتشار .NET 8 تا .NET 10، تغییرات چشمگیری را تجربه کرده است. مایکروسافت در این نسخهها تمرکز ویژهای بر افزایش خوانایی کد، بهینهسازی عملکرد، و کاهش پیچیدگی توسعه داشته است.
در C# 12 شاهد سادهتر شدن ساختارهای پایه مانند کلاسها و آرایهها هستیم؛
در C# 13 انعطاف بیشتر در کار با genericها، ref struct و پارامترهای params
به چشم میخورد؛ و در C# 14 زبان به مرحلهی بلوغی رسیده که میتواند
به کمک Extension Members و field keyword
تجربهای کاملاً مدرن را برای توسعهدهندگان رقم بزند.
در این مقاله، همهی این ویژگیها را با توضیح فنی و مثالهای کاربردی بررسی میکنیم تا بدانیم در مسیر طراحی پروژههای جدید بر پایهی .NET چه امکانات تازهای در اختیار داریم.
C# 12 – امکانات جدید در .NET 8
فیچر ۱: Primary Constructors
یکی از مهمترین تغییرات C# 12، معرفی سازندههای اصلی برای کلاسها و ساختارهاست.
پیشتر این ویژگی فقط برای recordها در دسترس بود.
class Person(string name, int age)
{
public void Introduce() =>
Console.WriteLine($"Hi, I'm {name}, {age} years old.");
}
var p = new Person("Sara", 25);
p.Introduce();
با این سینتکس جدید دیگر نیازی نیست فیلدها یا propertyها را بهصورت جداگانه تعریف کنید. پارامترها در تمام بدنهی کلاس قابل استفادهاند.
فیچر ۲: Collection Expressions
سینتکسی کوتاه و تمیز برای ساخت آرایهها و لیستها بدون نیاز به new یا {}:
var numbers = [1, 2, 3];
var more = [..numbers, 4, 5];
Console.WriteLine(string.Join(", ", more));
اپراتور .. برای ادغام چند مجموعه به کار میرود.
این ویژگی در کدهای LINQ و دادههای ثابت بسیار کاربردی است.
فیچر ۳: Default Lambda Parameters
اکنون میتوانید برای پارامترهای lambda مقدار پیشفرض تعیین کنید:
var multiply = (int x, int y = 2) => x * y; Console.WriteLine(multiply(4)); // 8
این ویژگی باعث کاهش تعداد overloadهای اضافی و سادهتر شدن delegateها میشود.
فیچر ۴: Alias Any Type
با این قابلیت میتوانید برای هر نوعی—even tupleها—یک alias تعریف کنید:
using Pair = (int X, int Y); Pair point = (10, 20); Console.WriteLine(point.X + point.Y);
فیچر ۵: Inline Arrays
برای ساخت ساختارهایی با آرایهی داخلی ثابت و سریع:
[System.Runtime.CompilerServices.InlineArray(4)]
struct Buffer
{
private int _element0;
}
var b = new Buffer();
C# 13 – تمرکز بر Generic و حافظه در .NET 9
فیچر ۱: Params Collections
حالا میتوانید پارامتر params را روی Span، IEnumerable و انواع مشابه استفاده کنید.
void Log(params ReadOnlySpan<string> messages)
{
foreach (var msg in messages)
Console.WriteLine(msg);
}
Log("Server started", "Listening...", "Connected!");
این قابلیت در APIهای سطح پایین و سیستمهایی که با حافظهی unmanaged کار میکنند، بسیار ارزشمند است.
فیچر ۲: ref struct Implements Interface
حالا ساختارهای ref struct میتوانند interface پیاده کنند:
interface IWritable { void Write(); }
ref struct FileWriter : IWritable
{
public void Write() => Console.WriteLine("Writing data...");
}
فیچر ۳: allows ref struct Constraint
میتوانید genericهایی بسازید که فقط ref struct قبول کنند:
void Process<T>(T value) where T : allows ref struct
{
Console.WriteLine(value.ToString());
}
فیچر ۴: field Keyword (Preview)
حالا propertyهای auto-implemented میتوانند به backing field خود دسترسی مستقیم داشته باشند:
public int Age
{
get => field;
set => field = Math.Max(0, value);
}
فیچر ۵: Partial Properties و Indexers
برای تقسیم کد بین developer و generator (مثلاً در Clean Architecture):
partial class Config
{
public partial string? ConnectionString { get; set; }
}
C# 14 – امکانات مدرن در .NET 10
فیچر ۱: Extension Members
اکنون میتوانید هر نوع عضوی (property، indexer، یا متد) را به کلاسهای موجود اضافه کنید بدون تغییر کد اصلی:
extension(string s)
{
public string Capitalize() =>
s[..1].ToUpper() + s[1..];
}
Console.WriteLine("hello".Capitalize());
فیچر ۲: Null-Conditional Assignment
میتوانید با ?. روی propertyها مقداردهی امن انجام دهید:
user?.Profile?.Name = "Ali";
فیچر ۳: nameof برای Generic باز
حالا میتوانید از nameof(List<>) استفاده کنید:
Console.WriteLine(nameof(List<>)); // List
فیچر ۴: field Keyword (Final)
از حالت Preview خارج شده و حالا کاملاً پایدار است:
public string Name
{
get => field;
set => field = value.Trim();
}
فیچر ۵: User-Defined Compound Assignment Operators
میتوانید عملگرهایی مانند += یا *= را بازتعریف کنید:
struct Vector
{
public int X, Y;
public static Vector operator +(Vector a, Vector b) =>
new() { X = a.X + b.X, Y = a.Y + b.Y };
public static Vector operator +=(Vector a, Vector b) =>
a + b;
}
نتیجهگیری
مسیر تکامل زبان C# از .NET 8 تا .NET 10 نشان میدهد که تمرکز مایکروسافت بر سه محور اصلی است:
- سادگی و خوانایی: حذف سینتکسهای تکراری و افزودن قابلیتهایی مانند Primary Constructors و Collection Expressions.
- کارایی و کنترل حافظه: پشتیبانی از ref struct و Span در genericها و پارامترها.
- توسعهپذیری و مدرنسازی: امکاناتی مثل Extension Members و field keyword که تعامل با Source Generatorها را تسهیل میکند.
امروز C# نهتنها در توسعهی اپلیکیشنهای سازمانی و وب، بلکه در حوزههایی مانند بازیسازی، سیستمهای بلادرنگ و پردازش داده نیز زبان انتخابی بسیاری از تیمهای حرفهای است. نسخههای آینده بدون شک مسیر این تکامل را با ترکیب قدرت، سادگی و هوشمندی بیشتر ادامه خواهند داد.