C # - Indexeurs

Un indexerpermet à un objet d'être indexé tel qu'un tableau. Lorsque vous définissez un indexeur pour une classe, cette classe se comporte comme unvirtual array. Vous pouvez ensuite accéder à l'instance de cette classe à l'aide de l'opérateur d'accès au tableau ([]).

Syntaxe

Un indexeur unidimensionnel a la syntaxe suivante -

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
   }
}

Utilisation d'indexeurs

La déclaration de comportement d'un indexeur est dans une certaine mesure similaire à une propriété. similaire aux propriétés, vous utilisez get et setaccesseurs pour définir un indexeur. Cependant, les propriétés renvoient ou définissent un membre de données spécifique, tandis que les indexeurs retournent ou définissent une valeur particulière à partir de l'instance d'objet. En d'autres termes, il divise les données d'instance en parties plus petites et indexe chaque partie, obtient ou définit chaque partie.

La définition d'une propriété implique de fournir un nom de propriété. Les indexeurs ne sont pas définis avec des noms, mais avec lethismot-clé, qui fait référence à l'instance d'objet. L'exemple suivant illustre le concept -

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();
      }
   }
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

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

Indexeurs surchargés

Les indexeurs peuvent être surchargés. Les indexeurs peuvent également être déclarés avec plusieurs paramètres et chaque paramètre peut être d'un type différent. Il n'est pas nécessaire que les index soient des entiers. C # permet aux index d'être d'autres types, par exemple, une chaîne.

L'exemple suivant illustre les indexeurs surchargés -

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();
      }
   }
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

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