2010-09-10 13 views
1

Comment les crochets dans une déclaration de méthode s'intègrent-ils à C#? C'est ce que je vois lors de la lecture sur la validation WPF, on peut utiliser IDataErrorInfo avec un exemple de ce qui suit.C# - comment les crochets dans une déclaration de méthode s'accordent-ils avec C#?

chaîne publique cette [chaîne propertyName]

// Error handling takes place here. 
public string this[string propertyName] // <== IE HERE 
{ 
    get 
    // etc 
    } 
} 

Je note MSDN dit: "Les crochets ([]) sont utilisés pour les tableaux, les indexeurs et les attributs. Ils peuvent également être utilisés avec des pointeurs." L'utilisation ci-dessus est-elle un pointeur?

Répondre

8

Il s'agit d'une fonctionnalité standard du langage C# appelée Indexer. Généralement, vous les utiliserez lors de l'écriture de vos propres collections ou de types similaires. Voici un exemple bref (pas réel).

public class Foo { 
    private List<int> m_Numbers = new List<int>(); 

    public int this[int index] { 
     get { 
      return m_Numbers[index]; 
     } 
     set { 
      m_Numbers[index] = value; 
     } 
    } 
} 

class Program { 
    static void Main() { 
     Foo foo = new Foo(); 
     foo[0] = 1; 
    } 
} 

Il y a beaucoup de choses cool que vous pouvez utiliser pour indexeurs si vous êtes créatif, il est une fonctionnalité vraiment bien de la langue.

+0

seulement nous soyons pas * trop * créatif. Les indexeurs sont conçus pour ressembler aux index de tableaux et agissent comme eux. –

4

Ceci est une déclaration d'un indexeur. C'est analogue à l'indexation de tableau. propertyName est une chaîne que la méthode utilise pour indexer un type de collection. La méthode renvoie la chaîne correspondante de la collection.

Bien sûr, la méthode pourrait faire autre chose, mais c'est ce que veut dire la sémantique.

2

Ce serait une propriété de l'indexeur. Ils sont utiles sur les collections personnalisées:

public class MyCustomCollection 
{ 
    List<MyObject> _list = new List<MyObject>(); 

    public string this[string name] 
    { 
     get { return _list.Single(o => o.Name == name) 
          .Select(o => o.Description); 
    } 

    public string this[int id] 
    { 
     get { return _list.Single(o => o.Id == id).Select(o => o.Description); 
    } 
} 

Et puis vous pouvez utiliser la collection comme:

MyCollection col = new MyCollection(); 

// Fill the collection 

string description = col["Name"]; 
string description2 = col[2];