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.
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).
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;
}
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!
Pour support:
public Object this[int index]
{
}
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
public class CustomCollection : List<Object>
{
public Object this[int index]
{
// ...
}
}
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"; }
}
};
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];
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; }
}
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;
}
}
}