PDA

View Full Version : what is Generics ?



dr_csharp
یک شنبه 26 اسفند 1386, 11:07 صبح
سلام دوستان
Generic چیه ؟ خودم فقط تا این حد میدونم که :

Generics are simply placeholders for actual types

ممنون میشم دوستان بیشتر توضیح بدن و کاربرد اونو بیان کنن

hassan razavi
یک شنبه 26 اسفند 1386, 11:30 صبح
در جنریک شما در هنگام ایجاد Class یا Method یا List یا ... تون وابسته و محدود به Type نمی شوید. می تونید کلی تعریف کنید (توسط <T>) و بعد در هنگام استفاده نوعش رو مشخص کنید.

یک نمونه بسیار خوب برای یک متد جنریک ، متد Swap می تونه باشه ، که اگه بصورت جنریک پیاده سایزی بشه ، شما می تونید هر جای 2 متغیر از هر نوع داده ای رو با فقط یک متد ، Swap کنید:

پیاده سازی متد:


public void Swap<T>(ref T val1,ref T val2)
{
T temp;
temp = val1;
val1 = val2;
val2 = temp;
}


فراخوانی متد :
نوع String


string x, y = "";
x = "10";
y = "aa";
Swap<string>(ref x, ref y);
MessageBox.Show(x.ToString() + " " + y.ToString());


نوع Int


string x, y = 0;
x = 10;
y = 15;
Swap<int>(ref x, ref y);
MessageBox.Show(x.ToString() + " " + y.ToString());

sinpin
یک شنبه 26 اسفند 1386, 11:40 صبح
اجازه میخوام من هم یک مثال بزنم و از زاویه ای دیگر ژنریک رو با هم ببینیم.

همانطور که میدونید ما دو مدل لیست داریم :
+ لیستهای معمولی (مثل ArrayList)
+ و لیستهای ژنریک (مثل <>List)

در مورد لیستهای ساده :
چون توسعه دهندگان دات نت نمیدونستند که استفاده کنندگان قراره چه چیزی رو درون یک لیست بریزند (در واقع هرچیزی ممکنه : از یک آبجکت person گرفته تا یک عدد یا رشته) اومدن و گفتن لیستهای ما آیتمهایی از نوع Object قبول میکنه در نتیجه مصرف کنندگان یعنی ما میتونستیم هرچیزی رو توش بریزیم. این داستان دو مشکل عمده دارد :
1- Boxing و unBoxing : یعنی شما زمانی که یک آیتم را به لیست اضابه و یا از لیست میخونید باید اون رو به تایپ مورد نظر خودتون cast کنید که این موضوع پر هزینه ای در کدنویسی محسوب میشود.
2- Type safety وجود ندارد. یعنی شما هرچیزی رو میتونید درون یک arrayList بریزید بدون آنکه کامپایلر به شما هشدار دهد و گاه با یک اشتباه کوچیک برنامه شما در زمان اجرا crach میکند.

ArrayList list = new ArrayList();
list.Add(new Person());
list.Add("new Person()"); // its ok at compile time!
list.Add(new Person());

و اما در لیستهای ژنریک (که با دات نت 2.0 آغاز شدند) شما در زمان کد نویسی مشخص میکنید که با چه تایپی میخواهید کار کنید. این موضوع دو حسن کلی دارد :
1- عملیات boxing و unboxing حذف و لذا performace بیشتر میشود
2- عملیات افزودن آیتم به لیست safe میشود چون اگر چیزی غیر از آنچه مشخص شده را درون لیست بریزید در کامپایل تایم به error برمیخورید.

List<Person> persons = new List<Person>();
persons.Add(new Person());
persons.Add("new Person()"); // error in compile time
persons.Add(new Person());