2009-01-08 11 views
223

Me gustaría añadir un operador a una clase. Actualmente tengo un método GetValue() que me gustaría reemplazar con un operador [].¿Cómo sobrecargar el operador [] en C#

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

    public int GetValue(int index) 
    { 
     return values[index]; 
    } 
} 

Respuesta

586
public int this[int key] 
{ 
    get 
    { 
     return GetValue(key); 
    } 
    set 
    { 
     SetValue(key,value); 
    } 
} 
+118

¿Por qué cada vez que necesito implementar un operador de índice, tengo que buscarlo? Y cada vez que termino en esta respuesta ... desearía poder votar hasta varias veces :) – DSO

+6

esto es así muy impresionante. ¿Se puede hacer en una interfaz? '' Interfaz iCache { objeto de este [clave de cadena] {get; conjunto; }} '' ** Edición: ** [Sí.] (Http://stackoverflow.com/questions/9586625/how-to-define-indexer-behaviour-to-an-interface) – Michael

+14

no sé por qué eligieron omitir la palabra "operador" en esta declaración, ¡ese es el error que siempre cometo! respuesta agradable –

55

creo que esto es lo que busca:

Indexers (C# Programming Guide)

class SampleCollection<T> 
{ 
    private T[] arr = new T[100]; 
    public T this[int i] 
    { 
     get 
     { 
      return 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]); 
    } 
} 
7
public int this[int index] 
    { 
     get 
     { 
      return values[index]; 
     } 
    } 
+2

cómo esta respuesta votó 5 veces, mientras que NO se puede cumplir !!!!!!! te esta falta el acceso para obtener !! –

+2

@HakamFostok Esta respuesta tiene más de siete años, y nadie se dio cuenta. Buena llamada. Editaré ahora – BFree

26

El operador [] se llama un indexador. Puede proporcionar indizadores que tomen un número entero, una cadena o cualquier otro tipo que desee usar como clave. La sintaxis es sencilla, siguiendo los mismos principios que los accesadores de propiedades.

Por ejemplo, en el caso en que un int es el índice o clave:

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

También puede agregar un acceso set para que el indexador se convierte en leer y escribir en lugar de sólo lectura.

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

    set 
    { 
    SetValue(index, value); 
    } 
} 

Si quiere cambiar el índice utilizando otro tipo de código, simplemente cambie la firma del indizador.

public int this[string index] 
... 
Cuestiones relacionadas