تفاوت کالکشن های جنریک با غیر جنریک
نام دوره: زبان سی شارپ مقدماتی
نویسنده: علی مقدم جاه (مدرس دوره)
تفاوت کالکشنهای جنریک با غیر جنریک چیست؟
در پست آموزش کالکشن چیست، با مفهوم کالکشن آشنا شدید.
به هر مجموعهای از داده که برخلاف آرایهها در حافظه کنار همدیگر نیستند، در زبانهای برنامهنویسی کالشن میگویند؛ که به دو دسته کلی تقسیم میشوند:
۱. کالکشنهای جنریک
۲. کالکشنهای غیر جنریک
تعریف کالکشنهای غیر جنریک: کالکشنهای غیر جنریک، مجموعهای از دادهها هستند که در حافظه کنار یکدیگر قرار نمیگیرند، اما همگی دارای یک نام بوده و میتوان در هر یک از خانههای آن مجموعه، مقادیری از جنسهای مختلف را درج کرد:
به عنوان مثال، کلاس ArrayList یکی از کالکشنهای غیرجنریک بوده که در مثال زیر مشاهده میکنید که برای مقداردهی هر کدام از خانههای این مجموعه، از یک نوع داده استفاده شده است:
ArrayList list1 = new ArrayList();
list1.Add(true);
list1.Add(5);
list1.Add(8.45);
list1.Add("ali");
list1.Add('A');
در مثال فوق، تمامی خانههای این کالکشن به نام list1 بوده که در زمان تعریف کالکشن آن را برنامهنویس به دلخواه خود مشخص کرده است؛ همچنین در ۵ خانهای که توسط متد Add برای این کالکشن از حافظه دریافت کردهایم، مقادیر مختلفی از دادههای bool, int, float, string, char را ذخیره کردهایم.
درنتیجه در هر یک از خانههای داخل یک کالکشن غیرجنریک، میتوان هر نوع دادهای را ذخیره کرد.
اما این تعریف برای کالکشنهای غیرجنریک صدق نمیکند!
علت آن هم افزایش سرعت کامپایل و همچنین عملیات Crud بر روی خانههای آن است.
تعریف کالکشنهای جنریک: کالکشنهای جنریک، مجموعهای از دادهها هستند که در حافظه کنار یکدیگر قرار نمیگیرند، اما همگی دارای یک نام بوده و تنها میتوان از یک نوع داده که در هنگام تعریف کالکشن مشخص شده است، داخل خانههای آن نگهداری و ذخیره کرد.
به عنوان مثال کالکشن List که در مجموعه کالکشنهای جنریک است، تنها قابلیت نگهداری از یک نوع داده را در خانههای خود دارد، برای درک بهتر این موضوع لطفا به مثال زیر توجه کنید:
List<string> list2 = new List<string>();
list2.Add("ali");
list2.Add("sara");
list2.Add("asghar");
list2.Add("mehdi");
list2.Add("mahin");
همانطور که در مثال فوق مشاهده میکنید، در هنگام تعریف یک لیست یا همان کالکشن از نوع جنریک، باید حتما نوع داده هر یک از خانههای آن را بر خلاف کالکشنهای غیر جنریک مشخص کنیم! (که ما نوع داده string را مشخص کردهایم)
درنتیجه تمامی ۵ خانهای که توسط متد Add برای این لیست از حافظه دریافت کردهایم، تنها قابلیت ذخیره سازی مقادیری از جنس string را خواهند داشت؛ علت آن هم این است که تمامی خانههای این کالکشن، در زمان تعریف لیست دارای شکلی از نوع string میشوند.
ساختار کلی یک کالکشن از نوع جنریک به شکل زیر است:
List<string> list2 = new List<string>();
نکته اول: کلمه List یک کلمه کلیدی بوده که به معنای تعریف یک مجموعه از دسته کالکشنهای جنریک است.
نکته دوم: داخل علامتهای < > در هر دو طرف مساوی، نوع داده هر یک از خانهها مشخص میشود.
نکته سوم: کلمه new یک کلمه کلیدی بوده و به معنای فضا گرفتن از حافظه است.
نکته چهارم: ()<نوع داده>List، متد سازنده یا Constructor کالکشن جنریک بوده که وظیفه ساختن این لیست در حافظه را بر عهده دارد.
نکته پنجم: به غیر از نحوه تعریف کالشکنهای جنریک که با نحوه تعریف کالکشنهای غیرجنریک متفاوت بوده، تمامی تعاریف و متدها باهم یکسان میباشند، یعنی از هر متدی که در کالکشنهای غیرجنریک میتوانیم استفاده کنیم، در کالکشنهای جنریک هم میتوان استفاده کرد.
جهت شرکت در دورههای زبان برنامه نویسی سیشارپ، از کد تخفیف heplc30 استفاده کنید.