C#中是否不支持静态索引器?

时间:2008-09-30 19:09:55

标签: c# .net clr

我一直在尝试这几种不同的方式,但我得出的结论是它无法完成。这是我过去从其他语言中享受的语言功能。这只是我应该注销的东西吗?

3 个答案:

答案 0 :(得分:59)

不,C#不支持静态索引器。然而,与其他答案不同,我看到如何轻松地指出它们。考虑:

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

我怀疑这种情况相对较少使用,但我认为禁止它是很奇怪的 - 就我所见,它给出了不对称的特殊原因。

答案 1 :(得分: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")   

答案 2 :(得分: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; }
         }
      }
   }
}

...可以按照您的意图访问。这可以在立即窗口中测试......

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