كسي ار دوستان ميدونه كه آيا ميشه از انواع Generic بعنوان پارامتر يك متد استفاده كرد يا نه؟ و اگه ميشه چه جوري؟
بعبارت ديگه من ميخوام متدي به شكل زير تعريف كنم
public void MyMethod(IList<T> mylist)
{
//do somthings
}
كسي ار دوستان ميدونه كه آيا ميشه از انواع Generic بعنوان پارامتر يك متد استفاده كرد يا نه؟ و اگه ميشه چه جوري؟
بعبارت ديگه من ميخوام متدي به شكل زير تعريف كنم
public void MyMethod(IList<T> mylist)
{
//do somthings
}
ميشه يه مثال بزنيد؟
راه حل ساده تر برای شما اینکه بجای Generic ها از Non-generic ها استفاده کنید. مثلا نوع رو روی ArrayList بزارید.
البته مسئله اینکه هروقت می خواهید اطلاعات درونش رو بخونید باید از Boxing استفاده کنید ( همون Cast کردن و کشف اینکه Object توی لیست از چه Type هستش)
این مسئله همون دلیلی بود که کلا Generic ها بوجود آمدن !
برای استفاده از Generic به عنوان پارامتر ورودی شما می تونید یک کلاس از نوع Generic تعریف کنید و بعد از اون کلاس استفاده کنید. در واقع شما یک کلاس جدید مثل ArrayList می سازید که قابل ارسال و دریافت توسط یک متد باشه.
تکنیک استفاده از Generic به عنوان ورودی پارامتر همینه .
کلا مزیت اصلی استفاده از Generic ها بجای ArrayList یا Hashtable و امثال آن این است که در مورد Non-generic ها هنگام کد نویسی شما درکی از محتوای درونشان ندارید و باید اصطلاحا برنامه نویسی دفاعی ( خطا یابی یا استفاده از شرط با کمک as و is و ...) پیاده کنید تا مطمئن شوید در زمان اجرای برنامه شی درون مثلا Arraylist از همان نوعی است که انتظار دارید.
اما اگر از Generic استفاده کنید هنگام کد نویسی Intellisense خود VS اجازه استفاده از Type ها نا همگون را نمی دهد و برنامه را Compile نمی کند. به همین دلیل خیال شما از درستی برنامه راحت می شود.
با سلام
این خلاف اصول کدنوسی مایکروسافته. خود مایکروسافت عملا گفته که از Generic استفاده بکنید. ArrayList به دلایل مثل cast و boxing و ... کارایی لازم رو در مقابل generic هارو ندارن. ( توضیحات تکمیلی بارها گفته شده )راه حل ساده تر برای شما اینکه بجای Generic ها از Non-generic ها استفاده کنید. مثلا نوع رو روی ArrayList بزارید.
جالب اونه خودتون هم دلیل اشتباه بودنش رو گفتید ولی بعدش چرا میگید استفاده بکنن ؟
و در مورد سوالی که دوستمون پرسیدن باید بگم برای درک بهتر میتونید اینجارو مطالعه بکنید
موفق باشید
آخرین ویرایش به وسیله mmd2009 : چهارشنبه 11 مرداد 1391 در 09:23 صبح دلیل: مثال رو اشتباهه متوجه شدم. همون لینک که دادم مثال داره
کسی که به خود اطمینان دارد به تعریف دیگران احتیاج ندارد. «گوستاو لوبون»
T رو باید جلوی نام متد معرفی کنید
public void MyMethod<T>(IList<T> list)
{
}
اگر احیانا T دارای کلاس پایه ای هست می تونید به صورت زیر مشخص کنید
public void MyMethod<T>(IList<T> list) where T : BaseClass
{
}
بالاخره همیشه هم ما نمیدونیم چه شیی میخواد توی لیست بشینه . ممکنه در زمان اجرا معلوم بشه محتویات لیست از چه نوعیه. و ما بخوایم برنامه رو خیلی سیال بنویسیم.این خلاف اصول کدنوسی مایکروسافته. خود مایکروسافت عملا گفته که از Generic استفاده بکنید. ArrayList به دلایل مثل cast و boxing و ... کارایی لازم رو در مقابل generic هارو ندارن. ( توضیحات تکمیلی بارها گفته شده )
کارایی محدودیت هم داره .
متاسفانه منظورتون رو متوجه نشدم ! میشه با یک مثال گفته هاتون رو دوباره بگید. اگه منظورتون اینه که نوع های مختلف ممکنه یک پارامتر داشته خب کاربرد T در مثال بالا هم همینه که وابسته به نوع خاصی نیست. شما یک بار int بکن و یک بار String و یک بار ...
کسی که به خود اطمینان دارد به تعریف دیگران احتیاج ندارد. «گوستاو لوبون»