متدهای جنریک

اگر بخواهید چندین متد با عملکرد مشابه ایجاد کنید و فقط تفاوت آنها در نوع داده‌ای باشد که قبول می‌کنند (مثلاً یکی نوع int و دیگری نوع double را قبول کند) می‌توان از متدهای جنریک برای صرفه جویی در کدنویسی استفاده کرد. ساختار عمومی یک متد جنریک به شکل زیر است :

returnType methodName<type> (type argument1)
{
    type someVariable;
}

مشاهده می‌کنید که بعد از نام متد یک نوع در داخل دو علامت بزرگتر و کوچکتر آمده است ( <type> ) که همه انواع در سی شارپ می‌توانند جایگزین آن شوند. برنامه زیر مثالی از نحوه استفاده از متد جنریک می‌باشد :

using System;

public class Program
{
    public static void Show<X>(X val)
    {
        Console.WriteLine(val);
    }

    public static void Main()
    {
        int intValue = 5;
        double doubleValue = 10.54;
        string stringValue = "Hello";
        bool boolValue = true;

        Show(intValue);
        Show(doubleValue);
        Show(stringValue);
        Show(boolValue);
    }
}
5
10.54
Hello
true

یک متد جنریک ایجاد کرده‌ایم که هر نوع داده‌ای راقبول کرده و مقادیر آنها را نمایش می‌دهد (خطوط 8-5). سپس داده‌های مختلفی با وظایف یکسان به آن ارسال می‌کنیم. متد نیز نوع X را بسته به نوع داده‌ای که به عنوان آرگومان ارسال شده است تغییر می‌دهد. به عنوان مثال وقتی یک داده از نوع int ارسال می‌کنیم، همه مکانهایی که X در آنها وجود دارد به int تبدیل می‌شوند و متد به صورت زیر در می‌آید :

public static void Show (int val)
{
    Console.WriteLine(val);
}

همچنین هنگام فراخوانی متد جنریک صریحاً می‌توانید نوعی را که به وسیله آن مورد استفاده قرار می‌گیرد ذکر کنید (البته لازم نیست). به عنوان مثال فراخوانی‌های متد بالا را می‌توان به صورت زیر هم نوشت :

Show<int>(intValue);
Show<double>(doubleValue);
Show<string>(stringValue);
Show<bool>(boolValue);

به یک نکته در مورد استفاده از متدهای جنریک توجه کنید و آن این است که، قبل از دانت نت 4.5، انجام محاسبات به وسیله متدهای جنریک امکان پذیر نبود. یعنی شما نمی توانستید که دو عدد را با هم جمع کنید:

public static void Show<X>(X val1, X val2)
{
    Console.WriteLine(val1 + val2);
}

ولی در نسخه 4.5 دات نت این مشکل با استفاده از کلمه کلیدی dynamic به صورت زیر قابل حل است :

Console.WriteLine((dynamic)val1 + (dynamic)val2);

شما می‌توانید چندین نوع خاص را برای متد جنریک ارسال کنید، برای این کار هر نوع را به وسیله کاما از دیگری جدا کنید.

public static void Show<X, Y>(X val1, Y val2)
{
    Console.WriteLine(val1);
    Console.WriteLine(val2);
}

به مثال زیر که در آن دو مقدار مختلف به متد ارسال شده است توجه کنید :

Show(5, true);

// OR

Show<int, bool>(5, true);

مشاهده می‌کنید که X با نوع int و Y با نوع bool جایگزین می‌شود. این نکته را نیز یادآور شویم که شما می‌توانید دو آرگومان هم نوع را هم به متد ارسال کنید :

Show(5, 10);

// OR

Show<int, int>(5, true);