✅ بهترین روشها برای سازماندهی کدهای Extension در C# 14 🧩✨
🗂 چطور Extension Blockها را سازماندهی کنیم؟
وقتی از کلیدواژه extension استفاده میکنید، میتوانید چندین extension member که روی یک type اعمال میشوند را داخل یک extension block قرار دهید.
این کار باعث کاهش تکرار 🔁 و کنار هم ماندن کدهای مرتبط میشود 🧠
همچنین میتوانید در یک static class چند extension block داشته باشید؛
مثلاً برای receiverهای متفاوت یا generic type parameterهای مختلف 👇
public static class CollectionExtensions
{
extension<T>(IEnumerable<T> source)
{
public bool IsEmpty => !source.Any();
public bool HasItems => source.Any();
public int Count => source.Count();
}
extension(IEnumerable<string> source)
{
public string JoinWithComma() => string.Join(", ", source);
public IEnumerable<string> NonEmpty() => source.Where(s => !string.IsNullOrEmpty(s));
}
extension<T>(List<T> list)
{
public void AddIfNotExists(T item)
{
if (!list.Contains(item))
{
list.Add(item);
}
}
}
}
🔄 ترکیب syntax قدیمی و جدید
میتوانید syntax قدیمی (this) و syntax جدید (extension) را در یک کلاس با هم استفاده کنید 👍
public static class StringExtensions
{
// Traditional syntax
public static bool IsEmail(this string value)
{
return value.Contains("@");
}
// New syntax
extension(string value)
{
public bool IsUrl =>
Uri.TryCreate(value, UriKind.Absolute, out _);
public string ToTitleCase() =>
CultureInfo.CurrentCulture.TextInfo.ToTitleCase(value.ToLower());
}
}
🚫 از ساختن Extension Classهای غولپیکر اجتناب کنید
یک کلاس بزرگ با extension برای دهها type مختلف، بهمرور تبدیل به کابوس نگهداری میشود 😵💫
بهتر است extensionها را بر اساس domain یا کاربرد گروهبندی کنید 👇
public static class ProductExtensions
{
extension(Product product)
{
// Product-specific extensions
}
}
public static class ValidationExtensions
{
extension(Order value)
{
// Validation logic
}
extension(OrderItem value)
{
// Validation logic
}
}
📌 انتخاب ساختار مناسب کاملاً به نیاز پروژه بستگی دارد:
یا یک static class برای هر type
یا گروهبندی بر اساس functionality
🧮 برای مقادیر محاسباتی از Extension Property استفاده کنید
اگر extensionای دارید که پارامتری نمیگیرد و فقط یک مقدار برمیگرداند،
بهتر است بهجای method، آن را property تعریف کنید 👌
extension(Order order)
{
public decimal TotalPrice =>
order.Items.Sum(item => item.Price * item.Quantity);
}
✍️ نامگذاری معنادار انتخاب کنید
ءExtension propertyها باید طوری خوانده شوند که انگار عضو اصلی type هستند.
از نامهایی که «داد میزنند extension هستند» پرهیز کنید ❌
// Good
public bool IsEmpty => !source.Any();
public string DisplayPrice => price.ToString("C");
📚 ءExtensionها را مستند کنید
در پروژههای بزرگ، حتماً از XML Comment استفاده کنید تا بقیه اعضای تیم دقیقاً بدانند این extension چه کاری انجام میدهد 🧑💻📖
extension(Product product)
{
/// <summary>
/// Gets whether the product is currently available for purchase.
/// </summary>
/// <remarks>
/// A product is available if its stock quantity is greater than zero.
/// </remarks>
public bool IsAvailable => product.StockQuantity > 0;
}
🧾 جمعبندی
کلیدواژه extension در C# 14 اختیاری است ✅
تمام extension methodهای قبلی شما بدون هیچ تغییری همچنان کار میکنند.
اما زمانی که:
میخواهید property اضافه کنید 🧩
ءmemberهای static داشته باشید 🏗
یا کدهای مرتبط را تمیزتر و یکجا نگه دارید 🧹
ءsyntax جدید تجربه توسعهدهنده بسیار بهتری فراهم میکند ✨
اگر با C# 14 و NET 10. کار میکنید، حتماً extension propertyها را در پروژههایتان امتحان کنید.
بهزودی متوجه میشوید چقدر جا دارد methodها به property تبدیل شوند و کدها طبیعیتر و قابلفهمتر شوند 🧠💡
امیدوارم این مطلب براتون مفید بوده باشه 🙌
تا مطلب بعدی، موفق باشید 👋