Les indexeurs statiques ne sont-ils pas pris en charge en C #? [dupliquer]
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?
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