
نوشته شده توسط
mohammad272005
به تعداد انسانها راه است برای اینکار. راحتترینش
ArrayList هست.
ArrayList a = new ArrayList();
a.Add(1);
a.Add("Hello");
string b = a[1];
// ...
استفاده از ArrayList به هیچ عنوان توصیع نمیشه به این دلیل که Type Safe نیست
چون از boxing وunBoxing استفاده میکنه
Boxing یعنی اینکه یک شی valu type را به یک شی reference type تبدیل کنیم
مثل مثال زیر
int a = 10;
object O = a;
همونطور که میبینید متغیر یا فیلد a که از نوع Int هست و value Type به حساب میاد در دستور دوم تبدیل به O یک یک شی reference type شده میباشد
به عمل فوق box کردن میگویند
و اما unBoxing چیه ؟
دقیقا عکس عمل فوق را unboxing میگویند
مثل مثال زیر
object O = 10;
int a = (int)O;
همونطور که دیدن برای unbox کردن نیاز یه تبدیل cast داریم
خوب اشکال این کجاست ؟
به قطعه کد زیر دقت کنید
void increment(object a)
{
int num1 = (int)a;
MessageBox.Show("incrementt is " + ++num1);
}
ورودی تابع فوق یک object هست پس میتوانیم فراخوانی های زیر را داشته باشیم بدون اینکه خطایی از جانب کامپایلر دریافت کنیم (در زمان کد نویسی منظورم هست)
increment(10); //no Error
increment("mahdi"); //RunTime Error
اما با اجرای دستورات فوق میبینید که خط دوم برنامه را دچار اخلال نیکنه
Array list ها هم دقیقا شبیه همین مطالبی که گفتم عمل میکنند
موقع اضافه کردن به array list عمل boxing و موقع خواندن عمل unboxing به وجود میاید
حال فرض کنید که همونطور که دوستمون mohammad272005 در کدشون نوشتن یه arryay list تعریف کردند
حالا به جای آخرین خط کد ایشون این کد را بذارید
int b =(int) a[1];
کد فوق از جانب کامپایلر هیچ ایرادی نداره و (خطای Syntax) به راحتی برنامه اجرا میشه اما در زمان اجرا طبیعتا برنامه منفجر خواهد شد چون مقدار a[1]="hello" میباشد و ماخواستیم این مقدار را به int تبدیل کنیم
چاره کار چیست ؟
چاره کار استفاده از generic ها هستند که دوستمون BeyondMicrosoft هم اشاره کوچیکی کردند و من کاملتر توضیح میدم
در واقع شما میتوانید به دو صورت از generic ها استفاده کنید مثل بقیه ابزار ها یا اینکه از ابزارهای موجود در دات نت استفاده کنید که تقریبا 90 نیاز ها را پاسخ گو هست و یا اینکه خودتون اقدام به نوشتن کلاس های generic کنید و از اونا استفاده کنید
من مورد اول یعنی استفاده از کلاس های generic موجود در دات نت را توضیح میدم اگه کسی مشتاق بود تا نوشتن کلاس های generic و استفاده از ان ها را هم توضیح بدم
کلاس های generic موجود در دات نت در namespace زیر قرار دارند
ُSystem.Collections.Generic
نحوه تمایز کلاس ها ی generic از بقیه کلاس ها اینه که به دنبال اسم کلاس مربوطه علامت <> را هم میبینید
موقعی که میخواین از یک کلاس یک آبجکت بگیرین به صورت زیر عمل میکردین
ClassName ObjectName =new ClassName ();
طریقه آبجکت گیری از کلاس ها ی generic هم دقیقا مانند فوق است با یک تغییر کوچولو
GenericClassName<Type> objectName =new GenericClassName<Type>();
که به جای type باید نوع دلخواه خودوتن را بذارید مثلا int یا String و ......
List<int> intList =new List<int>();
list<string> stringList =new list<string>();
در واقع با دستور فوق شما یک list که اعضای آن از نوع int , دیگری از نوع string هستند تولید خواهید کرد
حال از اینجا به بعد میتونید با توابع زیاد و کاربردی که در دستتون خواهد بود کارکنید مثلا
intList.dd(5);
stringList.Add("mahdi kiani");
, .....
اما همه این ها را گفتم که عیبی را که Arraylist ها داشتند را از بین ببریم
در واقع وقتی شما به جای ArrayList از generic ها استفاده میکنین جلوی عمل boxing و unboxing را میگیرین بدن صورت که
همونطور که دیدن به متد Add از کلاس ArrayList شما میتونید هم مقادیر string هم int و ..... را پاس بدین که همگی تبدیل به شی از نوع آبجکت میشدند
اما وقتی شما از یک genericList استفاده میکنید ورودی تابع Add شما مقداری خواهد بود که الزاما نوعش باید با نوعی که هنگام تعریف genericlist تعریف کردین باشه
یعنی شما نمیتوانید بنویسید
intList.Add("MK");
با نوشتن دستور فوق کامپایلر به شما خطا یی را گزارش خواهد کرد
پس دیگه عمل boxing را نخواهید داشت
همچنین موقع خواند داده های وارد شده هم عمل unbpxing را نخواهید داشت
به عنوان مثال به کدهای زیرتوجه کنید
کامپایلر به خط 3 ایراد خواهد گرفت
System.Collections.Generic.List<int> intList =new List<int>();
intList.Add(2);
string s = (string)intList[0];
امید وارم مفید بوده باشه
پا ورقی :
تمامی مطالب گفته شده در MSDN هم وجود دارد ولی من برای اون دسته از عزیزانی که وقت ترجمه کردن نداریند و یا در اینگلیسی خوندن و ترجمه کردن مشکل دارن یا اونایی که خوندن ولی در فهم اون مشکل داشتند گفتم