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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top