Les indexeurs statiques ne sont-ils pas pris en charge en C #? [dupliquer]

StackOverflow https://stackoverflow.com/questions/154489

  •  03-07-2019
  •  | 
  •  

Question

    

Cette question a déjà une réponse ici:

    
            
  •              Indexeurs statiques?                                      7 réponses                          
  •     
    

J'ai essayé cela de différentes manières, mais j'arrive à la conclusion que cela ne peut être fait. C'est une fonctionnalité linguistique que j'ai appréciée dans d'autres langues par le passé. Est-ce juste quelque chose que je devrais juste effacer?

Était-ce utile?

La solution

Non, les indexeurs statiques ne sont pas pris en charge en C #. Contrairement à d’autres réponses, je vois combien il pourrait être utile de les avoir. Considérez:

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

Je suppose que cela serait relativement rarement utilisé, mais je pense que c'est étrange que ce soit interdit - cela donne une asymétrie sans raison particulière, à ma connaissance.

Autres conseils

Vous pouvez simuler des indexeurs statiques à l'aide de propriétés indexées statiques:

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

Utilisation:

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

Non, mais il est possible de créer un champ statique contenant une instance d'une classe qui utilise un indexeur ...

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

... Ce qui pourrait être consulté dans la façon dont vous avez l'intention. Ceci peut être testé dans la fenêtre immédiate ...

Memory.Register[0] = 12 * 12;
?Memory.Register[0]
144
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top