جنریک درسی شارپ نوعی هست که برای تعریف یک کلاس، ساختار، رابط یا روش با متغیرها(پارامترهای نوع)و یا برای نشان دادن اینکه آنها می توانند یک یا چند نوع را ذخیره یا استفاده کنند، استفاده می شود. در #C، کامپایلر یک متغیرهایی را با نوع مشخص شده در زمان کامپایل جایگزین می کند.


اغلب ما از generics با مجموعه ها و روش هایی که بر روی آنها عمل می کنند را برای مشخص کردن نوع اشیائی که در یک مجموعه ذخیره می شود استفاده می کنیم. Generics در دات نت فریم ورک 2.0 با یک فضای نام جدید به نام System.Collections.Generic معرفی شده است.


در c #، generics برای بهبود قابلیت استفاده مجدد کد مفید است، نوع  عملکرد را در مقایسه با انواع غیر عمومی مانند arraylist.


برای تعریف یک کلاس یا روش به صورت کلی، ما باید از یک پارامتر نوع به عنوان یک حفره یا سوراخ با زاویه (<>) براکت استفاده کنیم.

 
در hاینجا نمونه ای از تعریف کلاس عمومی با پارامتر نوع (T) به عنوان حفره یا سوراخ با زاویه (<>) براکت نشون میدم




public class GenericClass<T>

{

public T msg;

public void genericMethod(T name, T location)

{

Console.WriteLine("{0}", msg);

Console.WriteLine("Name: {0}", name);

Console.WriteLine("Location: {0}", location);

}

}






اگر کلاس بالا را مشاهده کردید، یک کلاس (GenericClass) با یک پارامتر (msg) و روش (genericMethod) با استفاده از پارامتر نوع (T) به عنوان حفره یا سوراخ با زاویه (<>) براکت ها ایجاد کردیم.

 
در اینجا، براکت های زاویه (<>) نشان می دهد که GenericClass عمومی است و پارامتر نوع (T) برای پذیرش نوع درخواست شده مورد استفاده قرار می گیرد. نام پارامتر نوع می تواند هر چیزی مانند X یا U یا غیره بر اساس الزامات ما باشد.


به طور کلی، هنگام ایجاد یک نمونه از کلاس، ما باید یک نوع واقعی را مشخص کنیم، سپس کامپایلر تمام پارامترهای نوع مانند T یا U یا X و غیره را با نوع واقعی مشخص تعویض می کند. در c #، نمونه ای از ایجاد یک نمونه از کلاس عمومی است.


GenericClass<string> gclass = new GenericClass<string>();

gclass.msg = "Welcome to Csharp";
gclass.genericMethod("Ali Ahmadi"،Tabriz");


اگر کد بالا را مشاهده میکنید، ما یک نوع را به عنوان "string" میفرستیم تا کامپایلر تمام پارامترهای نوع (T) را با نوع تعریف شده "string" جایگزین کند و کلاس ما (GenericClass) مانند شکل زیر نشان داده شده است.



public class GenericClass

{

public string msg;

public void genericMethod(string name, string location)

{

Console.WriteLine("{0}", msg);

Console.WriteLine("Name: {0}", name);

Console.WriteLine("Location: {0}", location);

}

}


ما همچنین می توانیم انواع و روش های معمولی عمومی خود را ایجاد کنیم تا راه حل های عمومی خود را که ایمن و کارآمد هستند، ارائه دهیم.

مثال کلاس C #

در زیر نمونه ای از ایجاد یک کلاس عمومی با استفاده از پارامتر نوع (T) با زاویه (<>) brackets رو ببینید


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("****Generics Example****");

// Instantiate Generic Class, string is the type argument

GenericClass<string> gclass = new GenericClass<string>();

gclass.msg = "Welcome to Csharp";

gclass.genericMethod("Ali Ahmadi", "Tehran");

Console.ReadLine();
}
public class GenericClass<T>

{

public T msg;

public void genericMethod(T name, T location)

{

Console.WriteLine("{0}", msg);

Console.WriteLine("Name: {0}", name);

Console.WriteLine("Location: {0}", location);

}

}
}
}



نتیجه

روشهای عمومی

 اگر ما یک روش با پارامتر نوع تعریف کنیم، به اون روش عمومی میگیم در زیر نمونه ای از تعریف یک روش عمومی با پارامتر نوع با استفاده از براکت های زاویه (<>) است.



public void genericMethod<T>(T a, T b)

{

// Implementation

}


این روش عمومی را می توان با مشخص کردن نوع آرگومان یا بدون یک آرگومان مانند شکل زیر نشان داد.



genericMethod<int>(1, 2);



//or



genericMethod(1, 2);



درسی شارپ، می تونیم یک روش کلی با عبور از هر نوع استدلال را فراخوانی کنیم. در زیر نمونه ای از تعریف یک روش عمومی رو میبینید




using System;

namespace Tutlane

{

public class SampleClass

{

public void GMethod<T>(T a, T b)

{

Console.WriteLine("Param1: {0}", a);

Console.WriteLine("Param2: {0}", b);

}

}

class Program

{

static void Main(string[] args)

{

Console.WriteLine("****Generics Method Example****");

SampleClass s = new SampleClass();

s.GMethod<int>(1, 2);

s.GMethod("Ali AkbariDasari", "Tehran");

Console.ReadLine();

}

}

}




نتیجه


C # نمایندگان عمومی


در c # یک نماینده عمومی خواهد بود مانند نماینده عادی همان، اما تنها تفاوت نماینده عمومی یک نوع عمومی با زاویه (<>) براکت است.

 

در زیر نمونه ای از تعریف نماینده عمومی در زبان برنامه نویسی c # است.



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApp1
{
class Program
{
public delegate T SampleDelegate<T>(T a, T b);
static void Main(string[] args)
{

Console.WriteLine("****Generic Delegate Example****");

MathOperations m = new MathOperations();

// Instantiate delegate with add method

SampleDelegate<int> dlgt = new SampleDelegate<int>(m.Add);

Console.WriteLine("Addition Result: " + dlgt(10, 90));

// Instantiate delegate with subtract method

dlgt = m.Subtract;

Console.WriteLine("Subtraction Result: " + dlgt(10, 90));

Console.ReadLine();
Console.ReadLine();
}
class MathOperations

{

public int Add(int a, int b)

{

return a + b;

}

public int Subtract(int x, int y)

{

return x - y;

}

}

}
}


نتیجه اجرا
****Generic Delegate Example****
Addition Result: 100
Subtraction Result: -80




ویژگی های Generics

Generics یک تکنیک است که برنامه های شما را در موارد زیر غنی می کند:

     این به شما کمک می کند که استفاده مجدد کد را افزایش دهید، ایمنی و عملکرد را تایپ کنید.

     شما می توانید کلاس های مجموعه عمومی ایجاد کنید. کتابخانه کلاس دات نت شامل چند کلاس جدید مجموعه عمومی در System.Collections.Generic نام فضای نام دارد. شما می توانید از این مجموعه مجموعه های عمومی به جای کلاس های مجموعه در System.Collections فضای نام استفاده کنید.


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

     شما می توانید کلاس های عمومی را محدود کنید تا امکان دسترسی به روش ها در انواع داده های خاص فراهم شود.

     شما می توانید با استفاده از بازتاب اطلاعات مربوط به انواع مورد استفاده در نوع داده های عمومی را در زمان اجرا دریافت کنید.

در مثال قبلی، ما یک کلاس عمومی استفاده کرده ایم؛ ما می توانیم روش عمومی را با پارامتر نوع اعلام کنیم. برنامه زیر این مفهوم را نشان می دهد

using System;
using System.Collections.Generic;

namespace GenericMethodAppl {
class Program {
static void Swap<T>(ref T lhs, ref T rhs) {
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
static void Main(string[] args) {
int a, b;
char c, d;
a = 10;
b = 20;
c = 'I';
d = 'V';

//display values before swap:
Console.WriteLine("Int values before calling swap:");
Console.WriteLine("a = {0}, b = {1}", a, b);
Console.WriteLine("Char values before calling swap:");
Console.WriteLine("c = {0}, d = {1}", c, d);

//call swap
Swap<int>(ref a, ref b);
Swap<char>(ref c, ref d);

//display values after swap:
Console.WriteLine("Int values after calling swap:");
Console.WriteLine("a = {0}, b = {1}", a, b);
Console.WriteLine("Char values after calling swap:");
Console.WriteLine("c = {0}, d = {1}", c, d);

Console.ReadKey();
}
}
}

نتیجه اجرا

Int values before calling swap:
a = 10, b = 20
Char values before calling swap:
c = I, d = V
Int values after calling swap:
a = 20, b = 10
Char values after calling swap:
c = V, d = I