2009-07-29 7 views
1

dans le bloc de code suivant indexeur, pourquoi avons-nous besoin:question sur un simple indexeur (C#)

public string this[int pos] 
{ 
    get 
    { 
     return myData[pos]; 
    } 
    set 
    { 
     myData[pos] = value; 
    } 
} 

ce qui fait exactement "ce" dans ce [int pos] faire? Merci

/// Indexer Code Block starts here 
using System; 

/// <summary> 
///  A simple indexer example. 
/// </summary> 
class IntIndexer 
{ 
    private string[] myData; 

    public IntIndexer(int size) 
    { 
     myData = new string[size]; 

     for (int i = 0; i < size; i++) 
     { 
      myData[i] = "empty"; 
     } 
    } 

    public string this[int pos] 
    { 
     get 
     { 
      return myData[pos]; 
     } 
     set 
     { 
      myData[pos] = value; 
     } 
    } 

    static void Main(string[] args) 
    { 
     int size = 10; 

     IntIndexer myInd = new IntIndexer(size); 

     myInd[9] = "Some Value"; 
     myInd[3] = "Another Value"; 
     myInd[5] = "Any Value"; 

     Console.WriteLine("\nIndexer Output\n"); 

     for (int i = 0; i < size; i++) 
     { 
      Console.WriteLine("myInd[{0}]: {1}", i, myInd[i]); 
     } 
    } 
} 
+0

Quelqu'un d'autre a-t-il une odeur de devoirs? Si c'est ... il devrait être étiqueté comme tel. –

+0

ce n'est pas les devoirs. Im enseigner moi-même C# à travers un tutoriel en ligne http://www.csharp-station.com/Tutorials/Lesson11.aspx – user133466

Répondre

3

Du point de vue ac syntaxe #:

Vous avez besoin this car - sinon comment déclarer il? La fonctionnalité d'une classe doit avoir un nom ou une adresse pour la référencer.

Une signature de méthode est:

[modifiers] [type] [name] (parameters) 

public  string GetString (Type myparam); 

Une signature de propriété est:

[modifiers] [type] [name] 

public  string MyString 

Une signature sur le terrain est:

[modifiers] [type] [name] 

public  string MyString 

Depuis un indexeur n'a pas de nom, il ne serait pas avoir beaucoup de sens pour écrire:

public string [int pos] 

Nous utilisons donc this pour désigner son "nom".

+0

Les indexeurs ont un nom - "Item", et ce nom est marqué par DefaultMemberAttribute par le compilateur. Voir http://stackoverflow.com/questions/1119814/-net-defaultmemberattribute-what-does-it-do –

+0

@Cameron qui est au niveau IL. Ma réponse est au niveau de la syntaxe C# - il pourrait être MagicalIndexerKeyword [int pos] dans C#.C'est ce que les concepteurs de langage ont choisi. –

2

Ceci est juste un marqueur pour que le compilateur sache que cette propriété a une syntaxe d'indexeur.

Dans ce cas, myInd peut utiliser la "syntaxe de tableau" (par exemple myInd [9]).

0

Le mot-clé 'this' indique que vous définissez le comportement qui sera appelé lors de l'accès à votre classe comme s'il s'agissait d'un tableau. Puisque votre comportement de définition pour l'instance de classe, l'utilisation du mot-clé 'this' dans ce contexte est logique. Vous n'appelez pas myInd.indexer [], vous appelez myInd [].

4

Cela signifie que vous pouvez utiliser l'indexeur sur l'objet lui-même (comme un tableau).

class Foo 
{ 
    public string this[int i] 
    { 
     get { return someData[i]; } 
     set { someData i = value; } 
    } 
} 

// ... later in code 

Foo f = new Foo(); 
string s = f[0]; 
0

Il permet à votre classe de se comporter de manière similaire à un tableau. Dans ce cas, votre indexeur vous permet de référencer myData de manière transparente depuis l'extérieur de la classe IntIndexer.

Si vous n'avez pas l'indexeur déclaré, le code suivant échouerait:

myInd[1] = "Something"; 
0

Le dans votre cas « ce » précise que cette propriété est le indexer pour cette classe. Ceci est la syntaxe en C# pour définir un indexeur sur une classe, vous pouvez l'utiliser comme:

myInd[9] = ...