تبلیغات

ایندکسرها در سی شارپ (Indexers)

چه خبره اینجا؟
اگر می‌خواهید همانند آرایه‌ها، بتوانید برای کلاس خود ایندکس تعریف کنید؛ ایندکسرها مشکل شما را حل می‌کنند.

یک ایندکسر، به یک نمونه از یک کلاس یا struct این اجازه را می‌دهد که بتواند همانند یک آرایه، ایندکس شود! اگر ایندکسری برای یک کلاس تعریف شود، کلاس همانند یک آرایه‌ی مجازی (virtual array) رفتار خواهد کرد. همانطور که می‌دانید، اپراتور دسترسی به آرایه در سی شارپ بصورت «[ ]» است که ما نیز می‌خواهیم چنین قابلیتی برای کلاس خود ایجاد کنیم! یعنی همانند آرایه‌ها بتوان توسط ایندکسی، مقداری را تنظیم کرده یا بیرون کشید.

سینتکس

ایندکسرها تقریبا همانند ویژگی‌ها (Properties) در داخل کلاس تعریف می‌شوند؛ سینتکس آن بصورت زیر است:

  • access_modifier: سطح دسترسی به ایندکسر که می‌تواند public, private و … باشد.
  • return_type: نوع مقدار بازگشتی از ایندکسر
  • this: کلمه کلیدی که به نمونه‌ی فعلی ساخته شده از کلاس اشاره دارد.
  • argument_list: پارامترهای ایندکسر
  • get و set: همانند ویژگی‌‌ها برای تنظیم مقدار و گرفتن مقدار
نکته
در واقع ایندکسر، حسی همانند یک متد دارد و ورودی دریافت کرده و خروجی را برمی‌گرداند؛ که البته تفاوت‌های زیادی با سینتکس و ساختار متدها و همچنین ویژگی‌ها دارد. به عبارتی می‌توان گفت که یک پروپرتی پارامتر پذیر است! یعنی می‌تواند پارامتر ورودی داشته باشد!

مثال: ایندسکر یک بعدی

فرض کنید کلاسی بنام FuLLKadeIndexer داریم و بصورت زیر؛ ایندکسر آن را پیاده کردیم:

داخل این کلاس، یک آرایه‌ی رشته‌‎ای تعریف شده که چهار خانه دارد؛ سپس ایندکسری تعریف کردیم که پارامتری از نوع int دریافت کرده و خروجی string بدهد. در بلاک get این ایندکسر، از طریق ورودی index، مقدار را از آرایه‌ی رشته‌ای که در بالا تعریف کردیم بدست آورده و در set آن نیز مقدار را تغییر دادیم. البته هیچ اجباری نیست که حتما پارامتر ورودی ایندکسر عدد باشد، یا فقط یک ورودی داشته باشد، و یا اینکه حتما یک آرایه تعریف شود و ایندکسر به آن ارجاع داده شود! در واقع، ایندکسر تنها یک سینتکس است که می‌توانیم برای اهداف مختلفی از آن استفاده کنیم.

در کد زیر، از کلاس بالا استفاده شده:

در اینجا یک نمونه از کلاس ایجاد شده و همانند آرایه‌ها، از [] برای دسترسی به ایندکسر استفاده کردیم. خروجی این کد، بصورت زیر خواهد بود:

برخی نکات مهم

  • دو نوع ایندکسر وجود دارد: ایندکسر یک بعدی (One Dimensional Indexer) و ایندکسر چند بعدی (MultiDimensional Indexer)؛ که در کد بالا، به نوع یک بعدی آن اشاره شد. (یعنی فقط یک ورودی دریافت می‌کند.
  • ایندکسرها نیز می‌توانند اورلود (Overload) شوند.
  • گرچه شبیه ویژگی‌ها هستند، اما با آنها متفاوتند.
  • ایندکسرها به آبجکت‌ها امکان ایندکس شدن همانند آرایه‌ها را می‌دهند.
  • دسترسی set همواره برای تغییر مقدار و دسترسی get برای گرفتن مقدار استفاده می‌شود.
  • کلمه کلیدی this همیشه باید در تعریف ایندکسرها استفاده شود.
  • همانند ویژگی‌ها، در داخل set، برای گرفتن مقدار وارد شده به ایندکسر، از کلمه کلیدی value استفاده می‌شود.
  • از ایندکسرها گاها به عنوان آرایه‌های هوشمند یا آرایه‌های اسمارت (Smart Arrays) نیز یاد می‌شود. البته در برخی موارد Parameterized Property هم گفته می‌شود.
  • ایندکسرها نمی‌توانند استاتیک باشند و همیشه باید به آبجکت نسبت داده شوند.

مثال: ایندکسر دو بعدی

همانطور که گفته شد، مثال بالا یک ایندکسر یک بعدی است. اما برای تعریف ایندسکر چند بعدی، بایستی بیشتر از یک پارامتر برای آن تعیین کنیم. درواقع ایندکسرهای چند بعدی، تقریبا شبیه آرایه‌های چند بعدی هستند. به مثال زیر دقت کنید:

دقیقا همانند مثال قبلی است؛ با این تفاوت که دو پارامتر ورودی برای ایندکسر تعریف کردیم. حالا بیایید از این کلاس استفاده کنیم؛ مثلا بصورت زیر:

خروجی این:

مثال: ایندکسر فقط خواندی

بدون شک همانند ویژگی‌ها می‌توان یک ایندکسر را بصورت Read-Only در آورد؛ که در اینصورت، set حذف خواهد شد. به مثال زیر دقت کنید:

در اینجا نه تنها ایندکسر بصورت «فقط خواندنی» درآمده است، بلکه خروجی آن نیز برخلاف قبل که به یک آرایه وابسته بود، این بار جمع دو ایندکس است! حالا برای مثال، بصورت زیر از این کلاس استفاده می‌کنیم:

در اینجا از 0 تا 2 شمرده و سپس داخل آن، هرکدام را با شمارشی دیگر از اعداد 1 تا 2، به داخل این ایندکسر ارسال و نتیجه را چاپ می‌کنیم. خروجی کلی بصورت زیر خواهد بود:


در بخش بعدی، به روش Overload یا اورلود کردن ایندکسرها می‌پردازیم!

درس بعدی (اورلود کردن ایندکسرها)
تبلیغات
0
کانال تلگرام فول کده
تبلیغات

درباره نویسنده

هادی اکبرزاده

[ مدیر فول کده ]

علاقه‌مند به اشتراک گذاری اطلاعات در هر زمینه‌ای / برنامه‌نویس

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

نظرات ثبت شده بدون دیدگاه