327 votes

Comment surcharger l'opérateur [] en C# ?

Je voudrais ajouter un opérateur à une classe. J'ai actuellement une GetValue() que je voudrais remplacer par une méthode [] opérateur.

class A
{
    private List<int> values = new List<int>();

    public int GetValue(int index) => values[index];
}

842voto

Florian Greinacher Points 6769
public int this[int key]
{
    get => GetValue(key);
    set => SetValue(key, value);
}

191 votes

Pourquoi, chaque fois que j'ai besoin d'implémenter un opérateur d'indexation, dois-je le chercher ? Et à chaque fois, je tombe sur cette réponse... j'aimerais pouvoir la voter plusieurs fois :)

7 votes

C'est vraiment super génial. Est-ce que ça peut être fait dans une interface ? interface ICache { object this[string key] { get; set; } } Edit : Oui.

21 votes

Je ne sais pas pourquoi ils ont choisi d'omettre le mot "opérateur" dans cette déclaration - c'est l'erreur que je fais toujours ! Bonne réponse

69voto

William Brendel Points 15453

Je crois que c'est ce que vous recherchez :

Indexeurs (Guide de programmation C#)

class SampleCollection<T>
{
    private T[] arr = new T[100];
    public T this[int i]
    {
        get => arr[i];
        set => arr[i] = value;
    }
}

// This class shows how client code uses the indexer
class Program
{
    static void Main(string[] args)
    {
        SampleCollection<string> stringCollection = 
            new SampleCollection<string>();
        stringCollection[0] = "Hello, World";
        System.Console.WriteLine(stringCollection[0]);
    }
}

34voto

Jeff Yates Points 36725

L'opérateur [] est appelé un indexeur. Vous pouvez fournir des indexeurs qui prennent un entier, une chaîne de caractères ou tout autre type que vous souhaitez utiliser comme clé. La syntaxe est simple et suit les mêmes principes que les accesseurs de propriétés.

Par exemple, dans votre cas où un int est la clé ou l'index :

public int this[int index]
{
    get => GetValue(index);
}

Vous pouvez également ajouter un accesseur set pour que l'indexeur devienne en lecture et en écriture plutôt qu'en lecture seule.

public int this[int index]
{
    get => GetValue(index);
    set => SetValue(index, value);
}

Si vous voulez indexer en utilisant un type différent, il suffit de changer la signature de l'indexeur.

public int this[string index]
...

0 votes

Et n'oubliez pas que vous pouvez avoir n'importe quelle combinaison de types pour plusieurs indexeurs.....

12voto

BFree Points 46421
public int this[int index]
{
    get => values[index];
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X