2008-09-30 28 views

Trả lời

59

Không, trình lập chỉ mục tĩnh không được hỗ trợ trong C#. Không giống như các câu trả lời khác, tuy nhiên, tôi thấy làm thế nào có thể dễ dàng được điểm trong việc có chúng. Hãy xem xét:

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

Nó sẽ tương đối hiếm khi được sử dụng, tôi nghi ngờ, nhưng tôi cho rằng nó là không hợp lý vì không có lý do cụ thể nào.

+2

Chính xác. Họ có chỗ đứng của họ. Những người khác ở đây nói về vấn đề thiết kế rõ ràng chưa bao giờ làm việc với một ngôn ngữ cổ điển được cho phép, vì chúng rất hữu ích. – user9991

+1

Đúng. Quan điểm của tôi chính xác. Họ có một vị trí rất hữu ích trong kiến ​​trúc. Một số người bị mù, tôi đoán vậy! – Kilhoffer

+4

Crap. Bây giờ tôi phải viết một phương thức tĩnh Cache.Get (key) thay vì Cache [key] ... – Gishu

16

Bạn có thể mô phỏng indexers tĩnh sử dụng tài sản được lập chỉ mục tĩnh:

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

Cách sử dụng:

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

Mặc dù câu trả lời của Jon (như thường lệ) là chính xác nhất nhưng đây không phải là một lựa chọn không tốt cho một số tình huống. – Thiru

0

Không, nhưng nó có thể để tạo ra một trường tĩnh chứa một thể hiện của một lớp có sử dụng một người lập chỉ mục ...

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

... Có thể truy cập theo cách bạn đang dự định g. Điều này có thể được kiểm tra trong Cửa sổ ngay lập tức ...

Memory.Register[0] = 12 * 12; 
?Memory.Register[0] 
144 
Các vấn đề liên quan