2009-03-04 7 views
6

Quelle est l'utilisation réelle de l'indexeur en C#?À quoi servent les indexeurs?

Cela semble assez déroutant car je suis un nouveau programmeur C#. Cela ressemble à un tableau d'objets mais ce n'est pas le cas.

Répondre

8

Vous pouvez considérer un indexeur comme une propriété qui prend un paramètre. Ce que vous faites avec ce paramètre dépend de vous.

En général, les indexeurs sont utilisés lorsque vous fournissez un index à votre objet. Par exemple, si votre objet traite des collections d'éléments, il est logique de pouvoir y accéder en utilisant une simple syntaxe '[]' car il est facile de le considérer comme un tableau auquel nous donnons la position de l'objet que nous voulons revenir.

J'ai écrit une entrée de blog il y a quelques temps sur les aspects de indexers using reflection.
L'un des exemples que j'ai été:

using System; 
using System.Collections; 

public class DayPlanner 
{ 
    // We store our indexer values in here 
    Hashtable _meetings = new System.Collections.Hashtable(); 

    // First indexer 
    public string this[DateTime date] { 
     get { 
      return _meetings[date] as string; 
     } 
     set { 
      _meetings[date] = value; 
     } 
    } 

    // Second indexer, overloads the first 
    public string this[string datestr] { 
     get { 
      return this[DateTime.Parse(datestr)] as string; 
     } 
     set { 
      this[DateTime.Parse(datestr)] = value; 
     } 
    } 
} 

Et vous pouvez l'utiliser comme ceci:

DayPlanner myDay = new DayPlanner(); 
    myDay[DateTime.Parse("2006/02/03")] = "Lunch"; 
    ... 
    string whatNow = myDay["2006/06/26"]; 

C'est juste pour montrer que vous pouvez tordre le but d'un indexeur de faire ce que vous voulez .
ne signifie pas que vous devriez bien ... :-)

0

Toute collection dans .NET, qu'il s'agisse d'ArrayLists ou de listes génériques, possède, dans les coulisses, des tableaux dans leur structure sous-jacente. Les indexeurs sont simplement un moyen de changer le fonctionnement des index de tableaux réguliers, que ce soit en acceptant des chaînes comme une entrée pour rechercher un objet correspondant avec cette propriété, ou une autre entrée. Mais, encore une fois, sous tout ce sucre syntaxique, il finit toujours avec une représentation à un tableau.

Cette article might help explain how custom indexers are made.

Sur votre deuxième point, les Enums sont des entiers. Si vous avez besoin de représentations de caractères d'énumérations, vous êtes limité à la manipulation de chaînes, ou vous pouvez decorate your enums with appropriate attributes afin qu'elles émettent votre représentation de chaîne ou de caractère souhaitée.

1

indexeurs permettent instances d'une classe ou struct à indexer comme des tableaux, ils sont le plus souvent mis en œuvre dans les types dont le but principal est d'encapsuler une collection interne ou tableau.

Un accesseur get retourne une valeur et un accesseur ensemble affecte une valeur:

public T this[int i] 
{ 
    get 
    { 
     return arr[i]; 
    } 
    set 
    { 
     arr[i] = value; 
    } 
} 

Avec les énumérations, ils valeurs définies sont limitées à un petit nombre de types intégrales primitives (octet, sbyte, court, USHORT , int, uint, long, ulong).

Le type char est aussi un type intégral, mais il se distingue des autres types intégrantes de deux façons:

  • Il n'y a pas de conversions implicites d'autres types de type char. En particulier, même si les types sbyte, byte et ushort ont des plages de valeurs entièrement représentables à l'aide du type char, les conversions implicites de sbyte, byte ou ushort en char n'existent pas.

  • Les constantes du type char doivent être écrites sous forme de littéraux de caractère ou de littéraux entiers en combinaison avec un cast à type char. Par exemple, (char) 10 est le même que '\ x000A'.

(C# Language Specification 3.0, Section 4.1.5)

1

Le but d'un indexeur est juste que cela fonctionne comme un tableau, mais vous indiquez le code pour ce qui se passe lorsque vous lisez et écrivez à l'indexeur.

Un indexeur pourrait faire à peu près n'importe quoi pour fournir une collection comme behviour. Habituellement, il existe une sorte de collection privée que vous pouvez lire ou lire/écrire l'accès à l'aide de l'indexeur.

Un ENUM ne peut pas utiliser char comme il est le type de base, mais vous pouvez utiliser littéraux de caractères pour spécifier une valeur entière:

public enum Characters : int { 
    Alpha = 'a', 
    Beta = 'b' 
} 

Characters.Alpha aura la valeur 97, et Characters.Alpha.ToString () retournera la chaîne "Alpha". (char) Characters.Alpha donne la valeur 'a'.

Questions connexes