Domanda

    

Questa domanda ha già una risposta qui:

    
            
  •              Indicizzatori statici?                                      7 risposte                          
  •     
    

Ho provato questo in diversi modi, ma sto raggiungendo la conclusione che non può essere fatto. È una caratteristica linguistica che mi è piaciuta in altre lingue in passato. È solo qualcosa che dovrei semplicemente cancellare?

È stato utile?

Soluzione

No, gli indicizzatori statici non sono supportati in C #. A differenza di altre risposte, tuttavia, vedo come potrebbe essere facilmente utile averle. Prendere in considerazione:

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

Sospetto che sarebbe usato relativamente raramente, ma penso che sia strano che sia proibito - dà asimmetria senza un motivo particolare per quanto posso vedere.

Altri suggerimenti

Puoi simulare indicizzatori statici usando le proprietà indicizzate statiche:

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()); }
    }
}

Utilizzo:

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

No, ma è possibile creare un campo statico che contiene un'istanza di una classe che utilizza un indicizzatore ...

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 cui è possibile accedere nel modo in cui si intende. Questo può essere testato nella finestra immediata ...

Memory.Register[0] = 12 * 12;
?Memory.Register[0]
144
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top