2008-09-30 2 views
34

Я пробовал это несколько разных способов, но я пришел к выводу, что это невозможно. Это языковая функция, которой я наслаждался с других языков в прошлом. Это просто то, что я должен просто списать?Являются ли статические индексы не поддерживаемыми в C#?

ответ

59

Нет, статические индексы не поддерживаются в C#. Однако, в отличие от других ответов, я вижу, как можно легко указать их. Рассмотрим:

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

Было бы сравнительно редко, я подозреваю, но я думаю, что это странно, что это запрещено - это дает асимметрию без особой причины, насколько я могу видеть.

+2

Точно. У них есть свое место. Другие, говорящие здесь о проблемах дизайна, явно никогда не работали с классическим языком, который позволил, поскольку они очень полезны. – user9991

+1

Да. Я точно говорю. Они имеют очень полезное место в архитектуре. Думаю, у некоторых людей есть свои шторы. – Kilhoffer

+4

Crap. Теперь я должен написать статический метод Cache.Get (key) вместо Cache [key] ... – Gishu

16

Вы можете моделировать статические шаговые с использованием статических индексированных свойств:

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

Использование:

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

Хотя ответ Джона (как обычно) является наиболее правильным, это не такая плохая альтернатива для некоторых ситуаций. – Thiru

0

Нет, но можно создать статическое поле, которое хранит экземпляр класса, который использует указатель ...

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

... Доступ к которому можно получить способом, которым вы являетесь intendin г. Это может быть проверено в окне Immediate ...

Memory.Register[0] = 12 * 12; 
?Memory.Register[0] 
144 

 Смежные вопросы

  • Нет связанных вопросов^_^