c# - unario - que hacen las llaves en java
¿Cómo sobrecargo el operador de corchetes en C#? (8)
Aquí hay un ejemplo que devuelve un valor desde un objeto de lista interno. Debería darte la idea.
public object this[int index]
{
get { return ( List[index] ); }
set { List[index] = value; }
}
DataGridView, por ejemplo, le permite hacer esto:
DataGridView dgv = ...;
DataGridViewCell cell = dgv[1,5];
pero por mi vida no puedo encontrar la documentación en el operador de índice / corchete. ¿Cómo lo llaman? ¿Dónde se implementa? ¿Puede tirar? ¿Cómo puedo hacer lo mismo en mis propias clases?
ETA: Gracias por todas las respuestas rápidas. Brevemente: la documentación relevante está bajo la propiedad "Artículo"; la forma de sobrecargar es declarar una propiedad como public object this[int x, int y]{ get{...}; set{...} }
public object this[int x, int y]{ get{...}; set{...} }
; El indexador para DataGridView no se lanza, al menos de acuerdo con la documentación. No menciona lo que sucede si proporciona coordenadas no válidas.
ETA Again: OK, aunque la documentación no lo menciona (¡Microsoft travieso!), Resulta que el indexador para DataGridView de hecho lanzará una ArgumentOutOfRangeException si le proporciona coordenadas no válidas. Advertencia justa.
Esa sería la propiedad del elemento: http://msdn.microsoft.com/en-us/library/0ebtbkkc.aspx
Tal vez algo como esto podría funcionar:
public T Item[int index, int y]
{
//Then do whatever you need to return/set here.
get; set;
}
Para CLI C ++ (compilado con / clr) vea este enlace de MSDN .
En resumen, a una propiedad se le puede dar el nombre "predeterminado":
ref class Class
{
public:
property System::String^ default[int i]
{
System::String^ get(int i) { return "hello world"; }
}
};
Puedes encontrar como hacerlo here . En resumen es:
public object this[int i]
{
get { return InnerList[i]; }
set { InnerList[i] = value; }
}
Si está utilizando C # 6 o posterior, puede usar la sintaxis con expresión para el indexador de solo obtención:
public object this[int i] => this.InnerList[i];
Si te refieres al indexador de matriz, sobrecargas eso simplemente escribiendo una propiedad del indexador ... Y puedes sobrecargar, (escribe tantas como quieras) las propiedades del indexador siempre que cada una tenga una firma de parámetro diferente
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;
}
}
}
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!
Para el soporte:
public Object this[int index]
{
}
PERO
El operador de indexación de matriz no se puede sobrecargar ; sin embargo, los tipos pueden definir indexadores, propiedades que toman uno o más parámetros. Los parámetros del indexador se encierran entre corchetes, al igual que los índices de matriz, pero los parámetros del indexador se pueden declarar de cualquier tipo (a diferencia de los índices de matriz, que deben ser integrales).
Desde MSDN
public class CustomCollection : List<Object>
{
public Object this[int index]
{
// ...
}
}