2008-09-30 16 views

答えて

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

クラップス。今私はキャッシュ[キー]の代わりに静的メソッドCache.Get(キー)を書く必要があります... – 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

Jonの答え(いつものように)は最も正しいが、これは状況によってはそれほど悪い選択肢ではない。 – 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; } 
     } 
     } 
    } 
} 

...あなたが意図している方法でアクセスできるg。これは、イミディエイトウィンドウでテストすることができます...

Memory.Register[0] = 12 * 12; 
?Memory.Register[0] 
144 
関連する問題