سه شنبه ۲۷ شهريور ۱۴۰۳
Tut24 آموزش برنامه نویسی و مجله تخصصی فناوری ورود/عضویت

آموزش سی شارپ - شاخص‌گذاری

یک شاخص‌گذار (indexer) به یک شیء امکان شاخص‌گذاری مانند یک آرایه می‌دهد. وقتی شما یک شاخص‌گذار برای یک کلاس تعریف می‌کنید، این کلاس مانند یک آرایه مجازی (virtual array) عمل می‌کند. سپس می‌توانید به نمونهٔ این کلاس با استفاده از عملگر دسترسی آرایه ([ ]) دسترسی پیدا کنید.

سینتکس (Syntax)

یک شاخص‌گذار یک بعدی دارای سینتکس زیر است:

element-type this[int index] {

   // The get accessor.
   get {
      // return the value specified by index
   }
   
   // The set accessor.
   set {
      // set the value specified by index
   }
}

استفاده از شاخص‌گذارها (Use of Indexers)

تعریف رفتار یک شاخص‌گذار تا حدی مشابه یک خاصیت (property) است. همانند خاصیت‌ها، شما از مجموعه‌های دسترسی get و set برای تعریف یک شاخص‌گذار استفاده می‌کنید. با این حال، خاصیت‌ها یک عضو داده خاص را برمی‌گردانند یا تنظیم می‌کنند، در حالی که شاخص‌گذارها یک مقدار خاص از نمونهٔ شیء را برمی‌گردانند یا تنظیم می‌کنند. به عبارت دیگر، آن‌ها دادهٔ نمونه را به بخش‌های کوچک‌تر تقسیم کرده و هر بخش را فهرست‌بندی می‌کنند، بخش‌ها را برمی‌گردانند یا تنظیم می‌کنند.

تعریف یک خاصیت شامل ارائهٔ نام خاصیت است. شاخص‌گذارها با نام‌گذاری تعریف نمی‌شوند، بلکه با کلمه کلیدی this که به نمونهٔ شیء اشاره می‌کند، تعریف می‌شوند. مثال زیر مفهوم را نشان می‌دهد −

using System;

namespace IndexerApplication {
   
   class IndexedNames {
      private string[] namelist = new string[size];
      static public int size = 10;
      
      public IndexedNames() {
         for (int i = 0; i < size; i++)
         namelist[i] = "N. A.";
      }
      public string this[int index] {
         get {
            string tmp;
         
            if( index >= 0 && index <= size-1 ) {
               tmp = namelist[index];
            } else {
               tmp = "";
            }
            
            return ( tmp );
         }
         set {
            if( index >= 0 && index <= size-1 ) {
               namelist[index] = value;
            }
         }
      }
      static void Main(string[] args) {
         IndexedNames names = new IndexedNames();
         names[0] = "Zara";
         names[1] = "Riz";
         names[2] = "Nuha";
         names[3] = "Asif";
         names[4] = "Davinder";
         names[5] = "Sunil";
         names[6] = "Rubic";
         
         for ( int i = 0; i < IndexedNames.size; i++ ) {
            Console.WriteLine(names[i]);
         }
         Console.ReadKey();
      }
   }
}

وقتی کد بالا کامپایل و اجرا می‌شود، نتیجهٔ زیر را تولید می‌کند −


Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.

شاخص‌گذارهای سربارگذاری‌شده (Overloaded Indexers)

شاخص‌گذارها قابل سربارگذاری هستند. همچنین می‌توان شاخص‌گذارها را با چندین پارامتر تعریف کرد و هر پارامتر ممکن است از نوع متفاوتی باشد. ضروری نیست که شاخص‌ها اعداد صحیح باشند. در زبان C#، شاخص‌ها می‌توانند از نوع‌های دیگری مانند رشته باشند.

مثال زیر شاخص‌گذارهای سربارگذاری‌شده را نشان می‌دهد −

using System;

namespace IndexerApplication {
   class IndexedNames {
      private string[] namelist = new string[size];
      static public int size = 10;
      
      public IndexedNames() {
         for (int i = 0; i < size; i++) {
            namelist[i] = "N. A.";
         }
      }
      public string this[int index] {
         get {
            string tmp;
            
            if( index >= 0 && index <= size-1 ) {
               tmp = namelist[index];
            } else {
               tmp = "";
            }
            
            return ( tmp );
         }
         set {
            if( index >= 0 && index <= size-1 ) {
               namelist[index] = value;
            }
         }
      }
      
      public int this[string name] {
         get {
            int index = 0;
            
            while(index < size) {
               if (namelist[index] == name) {
                return index;
               }
               index++;
            }
            return index;
         }
      }

      static void Main(string[] args) {
         IndexedNames names = new IndexedNames();
         names[0] = "Zara";
         names[1] = "Riz";
         names[2] = "Nuha";
         names[3] = "Asif";
         names[4] = "Davinder";
         names[5] = "Sunil";
         names[6] = "Rubic";
         
         //using the first indexer with int parameter
         for (int i = 0; i < IndexedNames.size; i++) {
            Console.WriteLine(names[i]);
         }
         
         //using the second indexer with the string parameter
         Console.WriteLine(names["Nuha"]);
         Console.ReadKey();
      }
   }
}

هنگامی که کد بالا کامپایل و اجرا می شود، نتیجه زیر را ایجاد می کند -

Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.
2