Indexers انديكسرها در سی شارپ

چهارشنبه 29 خرداد 1392

Indexers انديكسرها در سی شارپ <br/> در اين درس با انديكسرها در C# آشنا مي‌شويم. اهداف اين درس به شرح زير مي‌باشند : <br/> • پياده‌سازي انديكسر <br/> • سرريزي انديكسرها (Overload) <br/> • درك چگونگي پياده‌سازي انديكسرهاي چند پارامتري <br/> • خلاصه <br/> • نكات مهم و مطالب كمكي در زمينه انديكسرها

Indexers   انديكسرها در C#  

در اين درس با انديكسرها در C# آشنا مي‌شويم. اهداف اين درس به شرح زير مي‌باشند :
• پياده‌سازي انديكسر
• سرريزي انديكسرها (Overload)
• درك چگونگي پياده‌سازي انديكسرهاي چند پارامتري
• خلاصه
• نكات مهم و مطالب كمكي در زمينه انديكسرها

انديكسرها
انديكسرها مفهومي بسيار ساده در زبان C# هستند. با استفاده از آنها مي‌توانيد از كلاس خود همانند يك آرايه استفاده كنيد. در داخل كلاس مجموعه‌اي از مقادير را به هر طريقي كه مورد نظرتان هست مديريت كنيد. اين اشياؤ مي‌توانند شامل مجموعه‌اي از اعضاي كلاس، يك آرايه ديگر، و يا مجموعه‌اي از ساختارهاي پيچيده داده‌اي باشند، جدا از پياده‌سازي داخلي كلاس، داده‌هاي اين ساختارها از طريق استفاده از انديكسرها قابل دسترسي هستند. به مثالي در اين زمينه توجه كنيد :

مثال 11-1 : نمونه‌اي از يك انديكسر

مثال 11-1 نحوه پياده‌سازي انديكسر را نشان مي‌دهد. كلاس IntIndexer داراي آراية رشته‌اي بنام myData مي‌باشد. اين آرايه، عنصري خصوصي (private) است و كاربران خارجي (external users) نمي‌توانند به آن دسترسي داشته باشند. اين آرايه درون سازندة (constructor) كلاس تخصيص‌دهي مي‌گردد كه در آن پارامتر size از نوع int دريافت مي‌شود، از آرايه myData نمونه‌اي جديد ايجاد مي‌گردد، سپس هر يك از المانهاي آن با كلمه "empty" مقدار‌دهي مي‌گردد.

عضو بعدي كلاس، انديكسر است كه بوسيلة كلمه كليدي this و دو براكت تعريف شده است، this[int pos]. اين انديكسر پارامتر موقعيتي pos را دريافت مي‌نمايد. همانطور كه حتماً تا كنون دريافته‌ايد پياده‌سازي انديكسر بسيار شبيه به پياده‌سازي يك ويژگي (property) است. انديكسر نيز داراي accessor هاي set و get است كه دقيقاً همانند property عمل مي‌كنند. همانطور كه در اعلان اين انديكسر نيز مشاهده مي‌شود، متغيري از نوع رشته‌اي را باز مي‌گرداند.

در متد Main() شيء جديدي از IntIndexer ايجاد شده است و مقاديري به آن افزوده مي‌شود و سپس نتايج چاپ مي‌گردند. خروجي اين برنامه به شكل زير است :

استفاده از integer جهت دسترسي به آرايه‌ها در اغلب زبانهاي برنامه‌سازي رايج است ولي زبان C# چيزي فراتر از آنرا نيز پشتيباني مي‌كند. در C# انديكسرها را مي‌توان با چندين پارامتر تعريف كرد و هر پارامتر مي‌تواند از نوع خاصي باشد. پارامتر‌هاي مختلف بوسيلة كاما از يكديگر جدا مي‌شوند. پارامترهاي مجاز براي انديكسر عبارتند از : integer، enum و string. علاوه بر آن، انديكسرها قابل سرريزي (Overload) هستند. در مثال 2-11 تغييراتي در مثال قبل ايجاد كرده‌ايم تا برنامه قابليت دريافت انديكسرهاي سرريز شده را نيز داشته باشد.

سرريزي انديكسرها
مثال 2-11 : انديكسرهاي سرريز شده (Overloaded Indexers)

مثال 2-11 نحوه سرريز كردن انديكسر را نشان مي‌دهد. اولين انديكسر كه داراي پارامتري از نوع int تحت عنوان pos است دقيقاً مشابه مثال 1-11 است ولي در اينجا انديكسر جديدي نيز وجود دارد كه پارامتري از نوع string دريافت مي‌كند. get accessor انديكسر جديد رشته‌اي را برمي‌گرداند كه نمايشي از تعداد آيتمهايي است كه با پارامتر مقداري data مطابقت مي‌كند. set accessor مقدار هر يك از مقادير ورودي آرايه را كه مقدارش با پارامتر data مطابقت نمايد را به مقداري كه به انديكسر تخصيص داده مي‌شود، تغيير مي‌دهد.

رفتار (behavior) انديكسر سرريز شده كه پارامتري از نوع string دريافت مي‌كند، در متد Main() نشان داده شده است. در اينجا set accessor مقدار "No value" را به تمام اعضاي كلاس myInd كه مقدارشان برابر با "empty" بوده است، تخصيص مي‌دهد. اين accessor از دستور زير استفاده نموده است : myInd["empty"] = "No value" . پس از اينكه تمامي اعضاي كلاس myInd چاپ شدند، تعداد اعضايي كه حاوي "No value" بوده‌اند نيز نمايش داده مي‌شوند. اين امر با استفاده از دستور زير در get accessor روي مي‌دهد : myInd["No value"]. خروجي برنامه بشكل زير است :

علت همزيستي هر دو انديكسر در مثال 2-11 در يك كلاس مشابه، تفاوت اثرگذاري و فعاليت آنهاست. اثرگذاري و تفاوت انديكسرها از تعداد و نوع پارامترهاي موجود در ليست پارامترهاي انديكسر مشخص مي‌گردد. در هنگام استفاده از انديكسرها نيز، كلاس با استفاده از تعداد و نوع پارامترهاي انديكسرها، مي‌تواند تشخيص دهد كه در يك فراخواني از كدام انديكسر بايد استفاده نمايد. نمونه‌اي از پياده‌سازي انديكسري با چند نوع پارامتر در زير آورده شده است :

خلاصه :
هم اكنون شما با انديكسرها و نحوة پياده‌سازي آنها آشنا شده‌ايد. با استفاده از انديكسرها مي‌توان به عناصر يك كلاس همانند يك آرايه دسترسي پيدا كرد. در اين مبحث انديكسرهاي سرريز شده و چند پارامتري نيز مورد بررسي قرار گرفتند.
در آينده و در مباحث پيشرفته‌تر با موارد بيشتري از استفادة انديكسرها آشنا خواهيد شد.

نكات :
1. منظور از انديكسر سرريز شده چيست؟
هنگاميكه از دو يا چند انديكسر درون يك كلاس استفاده مي‌كنيم، سرريزي (Overloading) انديكسرها رخ مي‌دهد. در هنگام فراخواني انديكسرها، كلاس تنها از روي نوع بازگشتي انديكسر و تعداد پارامترهاي آن متوجه مي‌شود كه منظور فراخواننده استفاده از كدام انديسكر بوده است.

2. از انديكسر چگونه مانند آرايه استفاده مي‌شود؟
همانطور كه در اين درس مشاهده كرديد دسترسي به عناصر انديكسر همانند آرايه‌ها با استفاده از يك انديس صورت مي‌پذيرد. با استفاده از اين انديس مي‌توان به عنصر مورد نظر كلاس دسترسي پيدا نمود.

3. يك مثال عملي استفاده از انديكسرها چيست؟
يك نمونة بسيار جالب از استفادة انديكسرها كنترل ListBox است. (ListBox عنصري است كنترلي كه با استفاده از آن ليستي از عناصر رشته‌اي نمايش داده مي‌شوند و كاربر با انتخاب يكي از اين گزينه‌ها با برنامه ارتباط برقرار مي‌كند. در حقيقت اين عنصر كنترلي يكي از روشهاي دريافت اطلاعات از كاربر است با اين تفاوت كه در اين روش ورودي‌هايي كه كاربر مي‌تواند وارد نمايد محدود شده هستند و از قبل تعيين شده‌اند. نمونه‌اي از يك ListBox قسمت انتخاب نوع فونت در برنامة Word است كه در آن ليستي از فونتهاي موجود در سيستم نمايش داده مي‌شود و كاربر با انتخاب يكي از آنها به برنامه اعلام مي‌كند كه قصد استفاده از كدام فونت سيستم را دارد.) ListBox نمايشي از ساختمان داده ايست شبيه به آرايه كه اعضاي آن همگي از نوع string هستند. علاوه بر اين اين كنترل مي‌خواهد تا در هنگام انتخاب يكي از گزينه‌هايش بتواند اطلاعات خود را بطور خودكار update نمايد و يا به عبارتي بتواند ورودي دريافت نمايد. تمامي اين اهداف با استفاده از انديكسر ميسر مي‌شود. انديكسرها شبيه به property ها اعلان مي‌شوند با اين تفاوت مهم كه انديكسرها بدون نام هستند و نام آنها تنها كلمه كليدي this است و همين this مورد انديكس شدن قرار مي‌گيرد و ساير موارد بشكل پارامتر به انديكسر داده مي‌شوند.

با نگاه به نحوه استفاده از انديكسر بهتر مي‌توان با مفهوم آن آشنا شد. براي مثال دسترسي به ListBox بشكل زير است :

نمونه برنامه‌اي كه در آن نحوة استفاده از انديكسر در عنصر كنترلي ListBox نشان داده شده، در زير آورده شده است :

خروجي نيز بشكل زير مي‌باشد :

توجه :
مطالب انتهايي اين درس كمي پيشرفته‌تر و پيچيده‌تر از مطالب قبل به نظر مي‌آيند. اين انتظار وجود ندارد كه شما كليه مطالب اين قسمت را بطور كامل متوجه شده باشيد، بلكه هدف تنها آشنا شدن شما با مسايل پيچيده‌تر و واقعي‌تر است. در آينده‌اي نه چندان دور، در سايت به صورت حرفه‌اي كليه مطالب و سرفصل هاي گفته شده را مورد بررسي قرار خواهيم داد. در ابتدا هدف من آشنايي شما با كليه مفاهيم پايه‌اي زبان C# است تا بعد از اين آشنايي به طور كامل و بسيار پيشرفته به بررسي كليه مفاهيم زبان بپردازيم. پس از اتمام آموزش اوليه تحولات اساسي در سايت مشاهده خواهيد كرد و در آن هنگام به بررسي كامل هر مبحث با مثال‌هايي بسيار واقعي و كاربردي خواهيم پرداخت.

ایمان مدائنی

نویسنده 1299 مقاله در برنامه نویسان
  • C#.net
  • 1k بازدید
  • 1 تشکر

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

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید