2008-09-30 17 views

Respuesta

59

No, los indexadores estáticos no son compatibles con C#. A diferencia de otras respuestas, sin embargo, veo cómo podría haber un punto en tenerlas. Considero:

Encoding x = Encoding[28591]; // Equivalent to Encoding.GetEncoding(28591) 
Encoding y = Encoding["Foo"]; // Equivalent to Encoding.GetEncoding("Foo") 

Sería utilizado con relativa poca frecuencia, sospecho, pero yo creo que es extraño que está prohibido - le da la asimetría por ninguna razón particular por lo que yo puedo ver.

+2

Exactamente. Ellos tienen su lugar. Otros aquí hablando sobre temas de diseño claramente nunca han trabajado con un lenguaje clásico que lo permitiera, ya que son muy útiles. – user9991

+1

Sí. Exactamente mi punto. Tienen un lugar muy útil en la arquitectura. Algunas personas tienen sus anteojeras, supongo! – Kilhoffer

+4

Mierda. Ahora debo escribir un método estático Cache.Get (clave) en lugar de Cache [key] ... – Gishu

16

Puede simular indexadores estáticas utilizando las propiedades indexadas estáticas:

public class MyEncoding 
{ 
    public sealed class EncodingIndexer 
    { 
     public Encoding this[string name] 
     { 
      get { return Encoding.GetEncoding(name); } 
     } 

     public Encoding this[int codepage] 
     { 
      get { return Encoding.GetEncoding(codepage); } 
     } 
    } 

    private static EncodingIndexer StaticIndexer; 

    public static EncodingIndexer Items 
    { 
     get { return StaticIndexer ?? (StaticIndexer = new EncodingIndexer()); } 
    } 
} 

Uso:

Encoding x = MyEncoding.Items[28591]; // Equivalent to Encoding.GetEncoding(28591) 
Encoding y = MyEncoding.Items["Foo"]; // Equivalent to Encoding.GetEncoding("Foo") 
+3

Aunque la respuesta de Jon (como de costumbre) es la más correcta, esta no es una alternativa tan mala para algunas situaciones. – Thiru

0

No, pero es posible crear un campo estático que contiene una instancia de una clase que utiliza un indexador ...

namespace MyExample { 

    public class Memory { 
     public static readonly MemoryRegister Register = new MemoryRegister(); 

     public class MemoryRegister { 
     private int[] _values = new int[100]; 

     public int this[int index] { 
      get { return _values[index]; } 
      set { _values[index] = value; } 
     } 
     } 
    } 
} 

... Que se puede acceder de la manera que se desea gramo. Esto se puede probar en la Ventana Inmediata ...

Memory.Register[0] = 12 * 12; 
?Memory.Register[0] 
144 
Cuestiones relacionadas