Frage

    

Diese Frage bereits eine Antwort hier:

    
            
  •              Static Indexer?                                      7 Antworten                          
  •     
    

Ich habe versucht, diese ein paar verschiedene Möglichkeiten, aber ich erreiche den Schluss, dass es nicht getan werden kann. Es ist eine Sprache Feature, das ich aus anderen Sprachen in der Vergangenheit genossen haben. Ist es nur etwas sollte ich einfach abschreiben?

War es hilfreich?

Lösung

Nein, statische Indexer nicht in C # unterstützt. Im Gegensatz zu anderen Antworten jedoch ich sehe, wie es Punkt leicht in sie haben könnte. Bedenken Sie:

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

Es wäre relativ selten verwendet werden, vermute ich, aber ich denke, es ist seltsam, dass es verboten ist -. Es gibt Asymmetrie ohne besonderen Grund, soweit ich sehen kann

Andere Tipps

Sie können simulieren statische Indexer statisch indiziert Eigenschaften mit:

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

Verbrauch:

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

Nein, aber es ist möglich, ein statisches Feld zu erstellen, die eine Instanz einer Klasse enthält, die einen Indexer verwendet ...

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

..., die in der Art und Weise zugegriffen werden können Sie beabsichtigen. Dies kann in den Direkt-Fenstern getestet werden ...

Memory.Register[0] = 12 * 12;
?Memory.Register[0]
144
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top