PDA

View Full Version : تعریف آرایه پویا



مهدی رحیم زاده
جمعه 23 شهریور 1386, 20:01 عصر
سلام
می تونید بگید که چطوری می تونم آرایه ای تعریف کنم که با هر بار کلیک من یک دونه به عناصر اون اضافه بشه (یعنی هیچ وقت پر نشه).

ممنونم :بوس:

BeyondMicrosoft
جمعه 23 شهریور 1386, 20:15 عصر
با سلام
ما راههای زیادی برای تعریف آرایه به خصوص پویا در .NET داریم یکیش به شکل زیر است :


List<string> a = new List<string>();


string یی که در چیزی شبیه به Tag نوشته شده نوع خونه های آرایه را مشخص میکنه بعد با تابع Add میتوانید به آن اضافه نمایید.


a.Add("1");

ونیز با Remove می توانید آن را از آرایه حذف نمایید.

همچنین برای اطلاعات بیشتر در مورد اون Tag ماننده(Generic Type) می توانید به لینک زیر مراجعه نمایید :
http://www.developercenter.ir/Forum/showthread.php?t=7415

mohammad272005
شنبه 24 شهریور 1386, 04:31 صبح
به تعداد انسانها راه است برای اینکار. راحتترینش ArrayList هست.


ArrayList a = new ArrayList();
a.Add(1);
a.Add("Hello");
string b = a[1];
// ...

gomnam
شنبه 24 شهریور 1386, 08:44 صبح
به تعداد انسانها راه است برای اینکار. راحتترینش 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 هم وجود دارد ولی من برای اون دسته از عزیزانی که وقت ترجمه کردن نداریند و یا در اینگلیسی خوندن و ترجمه کردن مشکل دارن یا اونایی که خوندن ولی در فهم اون مشکل داشتند گفتم

emad_67
شنبه 24 شهریور 1386, 09:45 صبح
خیلی ممنون از توضیحاتت دوست عزیز
یه سوال برام پیش اومد که آیا وقتی Arraylist رو وقتی که فقط یه نوع داده (مثلا int ) در اون قرار میدیم آیا باز هم استفادش توصیه نمیشه؟
ضمنا اگه لطف کنین در مورد نوشتن کلاس های generic هم توضیح بدین ممنون میشم

BeyondMicrosoft
شنبه 24 شهریور 1386, 11:09 صبح
http://www.developercenter.ir/Forum/showthread.php?t=7415

gomnam
شنبه 24 شهریور 1386, 11:24 صبح
خیلی ممنون از توضیحاتت دوست عزیز
یه سوال برام پیش اومد که آیا وقتی Arraylist رو وقتی که فقط یه نوع داده (مثلا int ) در اون قرار میدیم آیا باز هم استفادش توصیه نمیشه؟
ضمنا اگه لطف کنین در مورد نوشتن کلاس های generic هم توضیح بدین ممنون میشم



خیلی ممنون از توضیحاتت دوست عزیز


سلام خواهش میکنم
قابلی نداشت



یه سوال برام پیش اومد که آیا وقتی Arraylist رو وقتی که فقط یه نوع داده (مثلا int ) در اون قرار میدیم آیا باز هم استفادش توصیه نمیشه؟


جواب کامل در پست قبلی داده شده
ولی در یک کلمه نه درست نیست این نظر من هست(البته بستگی به دید افراد و روش برنامه نویسی داره)
همیشه به شاگردام توصیه میکنم که برنامه نویس بشن نه کد نویس !!!

QUOTE=emad_67;394930]
ضمنا اگه لطف کنین در مورد نوشتن کلاس های generic هم توضیح بدین ممنون میشم
[/QUOTE]
چشم
حتما
فقط یکم سرم شلوغه ولی سعی میکنم که زود تایپ کنم و بفرستم

موفق باشید
کیانی