⭐️ ءExtension Members ویژگی موردعلاقهی من در C# 14
ءExtension members ویژگی موردعلاقهی من در C# 14 هستند ✨
آنها یک تکامل مدرن از extension methodها محسوب میشوند که از نسخهی C# 3.0 در زبان وجود داشتند.
این سینتکس جدید باعث میشود بتوانید نهتنها متد، بلکه property و حتی static memberها را هم به typeهای موجود اضافه کنید 🧩
در این پست، موارد زیر را بررسی میکنیم 👇
• تفاوت کلیدواژهی extension با extension methodهای سنتی
• ساخت instance extension property
• اضافه کردن static extension member به typeها
• کار با genericها و type constraintها
• مثالهای واقعی از کاربرد extension memberها
• بهترین روشها برای سازماندهی کدهای extension
🚀 بزن بریم!
🔍 تفاوت Extension Keyword با Extension Methodهای سنتی
برنامهنویسهای #C از نسخهی C# 3.0 از extension methodها استفاده میکردند تا بدون تغییر سورسکد، به typeها قابلیت جدید اضافه کنند.
در روش سنتی، شما یک static class با static methodها میساختید.
قبل از C# 14، extensionها به این شکل نوشته میشدند 👇
public static class StringExtensions
{
public static bool IsNullOrEmpty(this string value)
{
return string.IsNullOrEmpty(value);
}
public static string Truncate(this string value, int maxLength)
{
if (string.IsNullOrEmpty(value) value.Length <= maxLength)
{
return value;
}
return value.Substring(0, maxLength);
}
}
اما C# 14 کلیدواژهی جدید extension را معرفی میکند و یک رویکرد مدرنتر ارائه میدهد 🆕
در سینتکس جدید، receiver (typeای که میخواهید extend کنید) از memberهایی که اضافه میکنید جدا میشود.
بهجای اینکه روی هر متد this بنویسید، یک extension block تعریف میکنید که receiver فقط یکبار مشخص میشود 👇
public static class StringExtensions
{
extension(string value)
{
public bool IsNullOrEmpty()
{
return string.IsNullOrEmpty(value);
}
public string Truncate(int maxLength)
{
if (string.IsNullOrEmpty(value) value.Length <= maxLength)
{
return value;
}
return value.Substring(0, maxLength);
}
}
}
🔹 در اینجا:
• ءextension، receiver را بهعنوان پارامتر میگیرد
• داخل بلاک، متدها و propertyها دقیقاً مثل memberهای واقعی type نوشته میشوند
• پارامتر value در تمام memberهای داخل بلاک در دسترس است
📌 نکتهی مهم:
سینتکس قدیمی و جدید هر دو به کد یکسانی کامپایل میشوند، بنابراین رفتارشان دقیقاً یکسان است.
سینتکس جدید اختیاری است و در کنار روش قدیمی کار میکند.
🧱 ءExtension Memberهای پشتیبانیشده
ءExtension جدید از موارد زیر پشتیبانی میکند ✅
• Methods
• properties
• Static methods
• Static properties
🧩 ساخت Instance Extension Property
ءExtension propertyها باعث میشوند کد شما خواناتر و expressiveتر شود ✨
بهجای صدا زدن متد، میتوانید از propertyهایی استفاده کنید که طبیعیتر به نظر میرسند.
مثلاً هنگام کار با collectionها، خیلی وقتها چک میکنیم که خالی هستند یا نه.
بهجای اینکه همهجا بنویسیم ()items.Any!، میتوانیم یک property مثل IsEmpty بسازیم 👇
public static class CollectionExtensions
{
extension<T>(IEnumerable<T> source)
{
public bool IsEmpty => !source.Any();
public bool HasItems => source.Any();
public int Count => source.Count();
}
}
public void ProcessOrders(IEnumerable<Order> orders)
{
if (orders.IsEmpty)
{
Console.WriteLine("No orders to process");
return;
}
foreach (var order in orders)
{
// Process order
}
}