🧬 متدهای جنریک در #C: نوشتن الگوریتمهای همهکاره
تو پست قبلی، با تایپهای جنریک مثل <Stack<T آشنا شدیم. اما قدرت جنریکها به کلاسها محدود نمیشه! ما میتونیم متدهایی بنویسیم که خودشون پارامترهای نوعی (<T>) داشته باشن.
به اینها متدهای جنریک (Generic Methods) میگن و به ما اجازه میدن الگوریتمهای بنیادی رو به صورت کاملاً قابل استفاده مجدد و Type-Safe بنویسیم.
1️⃣ مثال کلاسیک: متد <Swap<T
فرض کنید میخوایم یه متد بنویسیم که محتوای دو تا متغیر رو با هم عوض کنه. بدون جنریکها، باید برای int، string و هر نوع دیگهای یه نسخه جدا مینوشتیم (تکرار کد!). اما با یه متد جنریک، این کار رو فقط یک بار و برای همه تایپها انجام میدیم:
static void Swap<T>(ref T a, ref T b)
{
T temp = a;
a = b;
b = temp;
}
2️⃣ جادوی استنتاج نوع (Type Inference) ✨
بهترین بخش ماجرا اینه که در ۹۹٪ مواقع، شما نیازی ندارید که نوع T رو موقع صدا زدن متد مشخص کنید (<Swap<int). کامپایلر #C اونقدر هوشمنده که خودش از روی نوع آرگومانهایی که به متد پاس میدید، T رو تشخیص میده.
int x = 5;
int y = 10;
// نیازی به نوشتن Swap<int>(ref x, ref y) نیست!
Swap(ref x, ref y);
string s1 = "Hello";
string s2 = "World";
// کامپایلر خودش میفهمه T اینجا از نوع string هست
Swap(ref s1, ref s2);
3️⃣ قوانین و جزئیات مهم جنریکها ⚖️
چه چیزهایی میتوانند جنریک باشند؟
در #C، پارامترهای نوعی (<T>) فقط در تعریف کلاسها، استراکتها، اینترفیسها، دلیگیتها و متدها قابل استفاده هستن. اعضای دیگه مثل پراپرتیها یا سازندهها نمیتونن پارامتر نوعی جدیدی تعریف کنن، ولی میتونن از پارامتر نوعی که کلاسشون تعریف کرده، استفاده کنن.
🔹️ چندین پارامتر جنریک:
یک تایپ یا متد جنریک میتونه چند تا پارامتر نوعی داشته باشه:
// TKey و TValue دو پارامتر نوعی متفاوت هستن
class Dictionary<TKey, TValue> { /* ... */ }
🔹️ اورلودینگ بر اساس تعداد پارامترها:
شما میتونید اسم یک تایپ یا متد رو بر اساس تعداد پارامترهای جنریکش اورلود کنید. (به تعداد پارامترهای جنریک، "Arity" گفته میشه).
class A {} // Arity = 0
class A<T> {} // Arity = 1
class A<T1, T2> {} // Arity = 2🔹️ قرارداد نامگذاری:
طبق قرارداد، برای پارامترهای نوعی تک حرفی از T استفاده میشه. اگه پارامترهای بیشتری دارید، اونها رو با اسمهای توصیفیتر و با پیشوند T نامگذاری کنید (مثل TKey, TValue).
🤔 حرف حساب و تجربه شما
متدهای جنریک به شما اجازه میدن الگوریتمهای بنیادی رو یک بار بنویسید و همه جا به صورت type-safe ازشون استفاده کنید، که این اساس نوشتن کدهای تمیز و قابل استفاده مجدده.
🔖 هشتگها:
#CSharp #DotNet #OOP #Generics