2008-09-30 15 views

cevap

59

Hayır, statik dizinleyiciler C# ile desteklenmiyor. Ancak diğer cevaplardan farklı olarak, ben bunları sahiplenmenin nasıl kolay olabileceğini görüyorum. Düşünün:

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

Nispeten ender kullanılacak, sanıyorum, ama buna yasaklı garip olduğunu düşünüyorum - bu kadarıyla gördüğünüz gibi özel bir nedeni yok asimetri verir.

+2

Tam olarak. Onların yeri var. Burada tasarım konuları hakkında konuşan diğer kişiler, çok yararlı olduklarından, açıkça izin verilen klasik bir dil ile hiç çalışmamışlardır. – user9991

+1

Yep. Tam olarak benim nokta. Mimaride çok kullanışlı bir yer var. Bazı insanların körleri var, sanırım! – Kilhoffer

+4

Crap. Şimdi önbellek [anahtar] yerine statik bir yöntem Cache.Get (anahtar) yazmalıyım ... – Gishu

16

Statik endeksli özellikleri kullanılarak statik dizinleyicileri benzetilebilir:

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

Kullanımı:

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

Jon'un cevabı (her zamanki gibi) en doğru olsa da, bu bazı durumlar için bu kadar kötü bir alternatif değildir. – Thiru

0

Hayır, ama kullanan bir sınıfın bir örneğini tutan statik bir alan oluşturmak mümkündür bir dizinleyici ...

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

... Hangi yoldan ulaştığınız gibi erişilebilir g. Bu, aşağıdaki pencerede test edilebilir ...

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