web-dev-qa-db-fra.com

Comment surcharger l'opérateur à crochet en C #?

DataGridView, par exemple, vous permet de faire ceci:

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

mais pour toute ma vie, je ne trouve pas la documentation sur l'opérateur index/crochet. Comment s'appellent-ils? Où est-il mis en œuvre? Peut-il jeter? Comment puis-je faire la même chose dans mes propres cours?

ETA: Merci pour toutes les réponses rapides. En bref: la documentation pertinente est sous la propriété "Item"; le moyen de surcharger est en déclarant une propriété comme public object this[int x, int y]{ get{...}; set{...} }; l'indexeur pour DataGridView ne jette pas, au moins selon la documentation. Il ne mentionne pas ce qui se passe si vous fournissez des coordonnées non valides.

ETA à nouveau: OK, même si la documentation ne le mentionne pas (méchant Microsoft!), Il apparaît que l'indexeur de DataGridView lève en fait une exception ArgumentOutOfRangeException si vous lui fournissez des coordonnées non valides. Avertissement juste.

235
Coderer

vous pouvez trouver comment faire ici . En bref c'est:

public object this[int i]
{
    get { return InnerList[i]; }
    set { InnerList[i] = value; }
}

Si vous avez seulement besoin d'un getter, la syntaxe dans réponse ci-dessous peut également être utilisée (à partir de C # 6).

356
Ruben

Ce serait la propriété de l'élément: http://msdn.Microsoft.com/en-us/library/0ebtbkkc.aspx

Peut-être que quelque chose comme ceci fonctionnerait:

public T Item[int index, int y]
{ 
    //Then do whatever you need to return/set here.
    get; set; 
}
40
Ricardo Villamil
Operators                           Overloadability

+, -, *, /, %, &, |, <<, >>         All C# binary operators can be overloaded.

+, -, !,  ~, ++, --, true, false    All C# unary operators can be overloaded.

==, !=, <, >, <= , >=               All relational operators can be overloaded, 
                                    but only as pairs.

&&, ||                  They can't be overloaded

() (Conversion operator)        They can't be overloaded

+=, -=, *=, /=, %=                  These compound assignment operators can be 
                                    overloaded. But in C#, these operators are
                                    automatically overloaded when the respective
                                    binary operator is overloaded.

=, . , ?:, ->, new, is, as, sizeof  These operators can't be overloaded

    [ ]                             Can be overloaded but not always!

Source de l'information

Pour support:

public Object this[int index]
{

}

MAIS

L'opérateur d'indexation de tableau ne peut pas être surchargé ; Cependant, les types peuvent définir des indexeurs, des propriétés qui prennent un ou plusieurs paramètres. Les paramètres de l'indexeur sont placés entre crochets, tout comme les index de tableau, mais les paramètres de l'indexeur peuvent être déclarés de tout type (contrairement aux index de tableau qui doivent être intégraux).

De MSDN

24
Patrick Desjardins
public class CustomCollection : List<Object>
{
    public Object this[int index]
    {
        // ...
    }
}
6
Jason Miesionczek

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

En bref, une propriété peut recevoir le nom "default":

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

Si vous utilisez C # 6 ou une version ultérieure, vous pouvez utiliser la syntaxe avec expression pour l'indexeur en lecture seule:

public object this[int i] => this.InnerList[i];

4
amoss

Voici un exemple renvoyant une valeur à partir d'un objet List interne. Devrait vous donner l'idée.

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

Si vous parlez de l'indexeur de tableau, vous ne le surchargez qu'en écrivant une propriété d'indexeur. Vous pouvez également surcharger (en écrire autant que vous le souhaitez) les propriétés de l'indexeur, à condition que chacune ait 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;
        }
    }
}
1
Charles Bretana