TGViewer
C# Geeks (.NET) C# Geeks (.NET) @csharpgeeks · 550 subscribers
Post #569 217
⭐️ ء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
}
}
More from @csharpgeeks
  1. Sep 22, 2026یه مدتی قراره از دنیای NET. فاصله بگیرم، چون وقتشه برم سربازی. راستش نمیدونم این مدت رو چج…
  2. Sep 20, 2026🔥 حالا مشکل اصلی: Alert Storm فرض کن Database از دسترس خارج شده. ۱۰۰ Pod داری. هر Pod می‌…
  3. Sep 20, 2026🚨 طراحی سیستم Monitoring و Alerting در یک سیستم بزرگ فرض کن ساعت ۳ صبح است. سیستم شما با…
  4. Sep 19, 2026#Engineering_Leadership تصمیم نگرفتن هم یک تصمیم است یه چیز عجیب توی تیم‌های مهندسی: گاهی…
  5. Sep 19, 2026☑ چک‌لیست آماده‌سازی تیم، فرایندها و زیرساخت برای توسعه با AI توجه: هیچ چک‌لیستی جهان‌شمول…
  6. Sep 19, 2026📌پایان یک انتظار طولانی: اعتبارسنجی ناهمگام (Async Validation) در NET 11.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →