PDA

View Full Version : سوال: استفاده از Generic Type ها بعنوان پارامتر متد



msanaei
چهارشنبه 11 مرداد 1391, 00:20 صبح
كسي ار دوستان ميدونه كه آيا ميشه از انواع Generic بعنوان پارامتر يك متد استفاده كرد يا نه؟ و اگه ميشه چه جوري؟
بعبارت ديگه من ميخوام متدي به شكل زير تعريف كنم
public void MyMethod(IList<T> mylist)
{
//do somthings
}

msanaei
چهارشنبه 11 مرداد 1391, 06:43 صبح
ميشه يه مثال بزنيد؟

hakim22
چهارشنبه 11 مرداد 1391, 08:44 صبح
راه حل ساده تر برای شما اینکه بجای 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 نمی کند. به همین دلیل خیال شما از درستی برنامه راحت می شود.

mmd2009
چهارشنبه 11 مرداد 1391, 09:00 صبح
با سلام


راه حل ساده تر برای شما اینکه بجای Generic ها از Non-generic ها استفاده کنید. مثلا نوع رو روی ArrayList بزارید. این خلاف اصول کدنوسی مایکروسافته. خود مایکروسافت عملا گفته که از Generic استفاده بکنید. ArrayList به دلایل مثل cast و boxing و ... کارایی لازم رو در مقابل generic هارو ندارن. ( توضیحات تکمیلی بارها گفته شده )

جالب اونه خودتون هم دلیل اشتباه بودنش رو گفتید ولی بعدش چرا میگید استفاده بکنن ؟

و در مورد سوالی که دوستمون پرسیدن باید بگم برای درک بهتر میتونید اینجارو (http://www.c-sharpcorner.com/UploadFile/abhishekbhatore/GenericTypeWithSample07292005092634AM/GenericTypeWithSample.aspx)مطالعه بکنید

موفق باشید

gwbasic
چهارشنبه 11 مرداد 1391, 09:11 صبح
T رو باید جلوی نام متد معرفی کنید

public void MyMethod<T>(IList<T> list)
{
}


اگر احیانا T دارای کلاس پایه ای هست می تونید به صورت زیر مشخص کنید


public void MyMethod<T>(IList<T> list) where T : BaseClass
{
}

hakim22
چهارشنبه 11 مرداد 1391, 09:20 صبح
این خلاف اصول کدنوسی مایکروسافته. خود مایکروسافت عملا گفته که از Generic استفاده بکنید. ArrayList به دلایل مثل cast و boxing و ... کارایی لازم رو در مقابل generic هارو ندارن. ( توضیحات تکمیلی بارها گفته شده )

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

mmd2009
چهارشنبه 11 مرداد 1391, 09:43 صبح
متاسفانه منظورتون رو متوجه نشدم ! میشه با یک مثال گفته هاتون رو دوباره بگید. اگه منظورتون اینه که نوع های مختلف ممکنه یک پارامتر داشته خب کاربرد T در مثال بالا هم همینه که وابسته به نوع خاصی نیست. شما یک بار int بکن و یک بار String و یک بار ...