تفاوت بین آرایه (Array) , جگد اری (Jagged Array) , کالکشن (Collection) و جنریک (Generic)

Array

آرایه ها در دات نت ( سی شارپ ) تعدادی خانه حافظه هم شکل هستند که برای موارد کاملا مشخص بکار می روند . بطور مثال فرض کنید یک تعداد مشخص عدد دارید که اعداد همه از یک نوع هستند , یک راه آن است که به تعداد مورد نظر متغیر ایجاد شود و مقدار هر متغیر در آن ذخیره شود که این کار وقتی تعداد متغیرهای از یک شکل زیاد می شود , مدیریت را سخت می کند , برای حل این مشکل از آرایه استفاده می شود , آرایه ها تعدادی خانه حافظه هستند که همه آنها از یک نوع هستند مثلا همه از نوع رشته و یا همه از نوع عدد . به مثال زیر دقت کنید :

int a1,a2,a3,a4,a5,a6,a7,a8,a9;  //      متغیر هایی از یک نوع با نام های متفاوت

int[] a = new int[9];                            //  یک آرایه از نوع عددی با 9 عنصر

int[] b = new int[5]{12,4,6,7,90};  //    یک آرایه عددی با طول 5 عنصر و مقداردهی اولیه

آرایه ها نسبت به متغیرهای عادی تفاوتهای دارند برای مثال فرض کنید که از وجود یک مقدار خاص در آرایه مطلع شوید , برای این کار کافیست یکی از متدهای از پیش تعریف شده در آرایه را صدا کنید . این به این معنی است که فریم ورک برای آرایه ها یک سری متد نوشته که کار با آنها را سریع تر کند . البته کارآمدتر شود . همچنین آرایه ها از نظر مصرف حافظه بهینهترین حالت ممکن را دارند . آرایه ها می توانند یک – دو – سه و یا چند بعدی باشند که این قابلیت در محاسبات بسیار پرکاربرد است .

آرایه ه به دو دسته تقسیم می شوند . یکی آرایههای معمولی که تعریف آنها در بالا آمد و دیگری Jagged Array , جگد اری ها , آرایه هایی ( حداقل ) دوبعدی هستند که طول بعدهای آن برابر نیست برای مثال :

int[,] simple = new int[2,3]{{1,2,4},{4,45,2})   //   یک آرایه دو بعدی معمولی با مقدار

int[][] jagged = new int[3][];

jagged = new int{12,3,6,17,3,79,23,};

jagged = new int{6,89,34};

jagged = new int{54,25};

در مثال بالا یک آرایه دو بعدی ساده را دیدید که دارای دو ردیف و سه ستون بود , یعنی لزوما باید برای هر ردیف س عنصر تعریف شود . در مثال جگد اری , یک آرایه با سه ردیف و تعداد نامشخصی ستون تعریف شده که در ردیف اول 7 عنصر و در ردیف دوم سه عنصر و در ردیف سوم دو عنصر قرار دارد . مزیت جگد اری نسبت به آرایه معمولی این است که تعداد یکی از بعدها می تواند نامشخص باشد .

Collection

کالکشن ها که در دات نت یک معرفی شدند یکسری ارایه بودند که نوع نداشتند و درواقع نوع آنها object بود , برای مثال شما می خواهید یک لیست داشته باشید که بعدا یکسری عدد در آن بریزید , اما هنوز از نوع عدد ( int , Decimal , Double … ) اطلاعی ندارید , از آنجا که کالکشن ها آبجکت می گیرند شما می توانید بدون دردسر کد مربوطه را بنویسید . این قابلیت باعث همه گیر شدن کالکشن ها شد و کالکشن های پیش فرض و پرکاربردی را مایکروسافت ارائه کرد برای مثال Stack و Queue و یا ArrayList و غیره و یا حتی یکسری کالکشن ویژه که برای کاربردهای خاص به کار می آمدند مثل HashTable . ( در اینجا قصد معرفی انواع مختلف و کاربردها را ندارم ) این کالکشن ها بخاطر کاربردی بودن و قابلیت گرفتن آبجکت ( آبجکت به این دلیل که معلوم نبود کاربر چه چیزی می خواهد مثلا در Queue بگذارد ) سریعا در بین برنامه نویس ها پذیرفته شد و رشد کرد . اما یک مشکل بزرگ وجود داشت .

System.Collections.Queue person = new Queue();  // یک کالکشن از نوع صف با نام شخص

همانطور که گفته شد کالکشن ها آبجکت می گرفتند و این باعث بروز مشکلاتی شد , برنامه نویس ها نمی دانستند که سایر اعضا چه نوع عددی در کالکشن ریخته اند , و هنگام Cast کردن مشکلات ادیده ای پیش آمد .  مثلا برنامه نویس یک , یک کالکشن ایجاد کرده و یکسری double داخل آن ریخته , حالا برنامه نویس دو , صرفا از عددی بودن این کالکشن خبر داشت و هنگام Cast کردن آن به int به مشکل می خورد . این مشکلات باعث بوجود آمدن Generic شد.

Generic

جنریک که در دات نت دو , معرفی شد یک کالکشن بود که بجای آبجکت یک نوع می گرفت , برای مثال

Ssystem.Collections.Generic.Queue<int> myTypedcollection = new Queue<int>();

در مثال بالا یک جنریک با نوع int ایجاد شده است , مزیت استفاده از جنریک , مشخص بودن نوع آن برای همه است , مهم نیست که برنامه نویس دو , کنار برنامه نویس یک باشد تا از نوع عددی کالکشن باخبر باشد , جنریک مشخصا اعلام می کند که نوع آن چیست . به همه برنامه نویس ها توصیه می شود که از جنریک ها بجای کالکشن های قدیمی استفاده کنند . تقریبا بجای همه کالکشن های دات نت یک , معادلی در جنریک ها موجود است . برای مثال

کالکشن ArrayList به جنریک  <> List تبدیل شده و یا Queue , Stack مشخصا با همین نام Stack<> و Queue<> در دات نت دو معرفی شده اند . بعضی از جنریک ها کاملا جدید هستند و تقریبا برای هر کار پرکاربردی یک جنریک وجود دارد .

2 Responses to تفاوت بین آرایه (Array) , جگد اری (Jagged Array) , کالکشن (Collection) و جنریک (Generic)

  1. jamshid says:

    آقای حاجلو دوباره تاکید می کنم: لطفا در مورد اضافه شدن همه لینکهایتان به مهندس رسیدگی کنید. این کار از نظر اخلاقی صحیح نیست.

  2. درود بر شما آقای جمشید
    پیرو نظرات شما در تارنمای شخصی من ( برنامه نویسی به سبک غربی , با طعم قرمه سبزی به آدرس https://hajloo.wordpress.com ) باید موارد زیر را یاد آور شوم

    سایت های اشتراک لینک مانند مهندس – Digg – Dilicious – Balatarin – iDevCenter و غیره ، به منظور به اشتراک گذاشتن مطالبی است که شخصی آنها را نوشته – این کار به چند منظور انجام می شود .نخست آنکه مطالب یک شخص در موتورهای جستجو از چند آدرس متفاوت قابل دسترسی شود – دو دیگر آنکه مطالب یک شخص توسط افراد عضو یک سایت اشتراک لینک دیده شده و در نهایت اشخاص علاقمند به یک مطلب خاص ، برای مطالعه آن مطلب به وبلاگ اصلی مراجعه کنند ، سه دیگر آنکه شخص نویسنده از میزان مورد پسند واقع شدن یک مطلب خاص پی برده و در نهایت مطالب مشابهی را برای جذب مخاطب بیشتر تولید کند ، که این مورد هم با توجه به تعداد مراتب مراجعه از یک لینک خاص ( که معمولا در کنترل پنل مدیر سایت قرار دارد ) و هم با توجه به تعداد آرای جمه شده برای آن مطلب قابل پی گیری است. چهارم آنکه سایت های اشتراک لینک مکان مناسبی برای سنجش کیفیت مطالب یک شخص ، در مقایسه با سایرین است .

    با توجه به موارد بالا بنده هیچ وقت نه به دوستانم مطالب را لینک می دهم که برای من رای جمع کنند و نه حتی از اشخاص رای دهنده اطلاعی دارم ( البته سایت iDevCenter خوشبختانه اسامی اشخاص راس دهنده را نشان می دهد ) . و مطمئنا برای از دست ندادن اطلاعات مفیدی که می توانم از این سایت ها جمع کنم ، هیچ وقت لینک اضافه شده خودم را به سایرین حتی معرفی هم نمی کنم .بنابراین امیدوارم این مسئله برای شما حل شود در غیر این صورت بفرمایید که بنده از این پس هیچ کدام از لینکهایم را در مهندس اضافه نکنم . همچنین در صورت داشتن ابهامات دیگر با ای-میل بنده ارتباط برقرار کنید .

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: