273 votes

Comment surcharger l'opérateur de crochets en C# ?

DataGridView, par exemple, vous permet de le faire :

DataGridView dgv = ...;
DataGridViewCell cell = dgv[1,5];

mais je n'arrive pas à trouver la documentation sur l'opérateur index/carré. Comment l'appelle-t-on ? Où est-il implémenté ? Peut-il être lancé ? Comment puis-je faire la même chose dans mes propres classes ?

ETA : Merci pour toutes les réponses rapides. En bref : la documentation pertinente se trouve sous la propriété "Item" ; la façon de surcharger est de déclarer une propriété comme public object this[int x, int y]{ get{...}; set{...} } l'indexeur pour DataGridView ne lance pas, du moins selon la documentation. Elle ne mentionne pas ce qui se passe si vous fournissez des coordonnées invalides.

ETA encore : OK, même si la documentation n'en fait pas mention (vilain Microsoft !), il s'avère que l'indexeur de DataGridView lèvera en fait une exception ArgumentOutOfRangeException si vous lui fournissez des coordonnées invalides. C'est un avertissement.

4voto

Rob Prouse Points 9193

Voici un exemple de retour d'une valeur à partir d'un objet Liste interne. Cela devrait vous donner une idée.

  public object this[int index]
  {
     get { return ( List[index] ); }
     set { List[index] = value; }
  }

3voto

Pour CLI C++ (compilé avec /clr) voir ce lien MSDN .

En bref, on peut donner à une propriété le nom de "défaut" :

ref class Class
{
 public:
  property System::String^ default[int i]
  {
    System::String^ get(int i) { return "hello world"; }
  }
};

1voto

Charles Bretana Points 59899

Si vous voulez parler de l'indexeur de tableau, vous le surchargez simplement en écrivant une propriété d'indexeur Et vous pouvez surcharger (écrire autant de propriétés d'indexation que vous le souhaitez) tant que chacune a une signature de paramètre différente.

public class EmployeeCollection: List<Employee>
{
    public Employee this[int employeeId]
    {   
        get 
        { 
            foreach(var emp in this)
            {
                if (emp.EmployeeId == employeeId)
                    return emp;
            }

            return null;
        }
    }

    public Employee this[string employeeName]
    {   
        get 
        { 
            foreach(var emp in this)
            {
                if (emp.Name == employeeName)
                    return emp;
            }

            return null;
        }
    }
}

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