¿Los indexadores estáticos no son compatibles con C #? [duplicar]
Pregunta
Esta pregunta ya tiene una respuesta aquí:
- ¿Indizadores estáticos? 7 respuestas
He estado intentando esto de diferentes maneras, pero estoy llegando a la conclusión de que no se puede hacer. Es una característica del idioma que he disfrutado de otros idiomas en el pasado. ¿Es solo algo que debería escribir?
Solución
No, los indexadores estáticos no son compatibles con C #. Sin embargo, a diferencia de otras respuestas, veo que fácilmente podría haber un punto en tenerlas. Considera:
Encoding x = Encoding[28591]; // Equivalent to Encoding.GetEncoding(28591)
Encoding y = Encoding["Foo"]; // Equivalent to Encoding.GetEncoding("Foo")
Sospecharía que sería relativamente poco frecuente, pero creo que es extraño que esté prohibido: da asimetría por ninguna razón en particular, por lo que puedo ver.
Otros consejos
Puedes simular indexadores estáticos usando 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")
No, pero es posible crear un campo estático que contiene una instancia de una clase que usa 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; }
}
}
}
}
... A los que se puede acceder de la forma que usted pretende. Esto se puede probar en la ventana Inmediata ...
Memory.Register[0] = 12 * 12;
?Memory.Register[0]
144