Khai báo một Từ điển bên trong một lớp tĩnh


90

Làm thế nào để khai báo một đối tượng từ điển tĩnh bên trong một lớp tĩnh? Tôi đã thử

public static class ErrorCode
{
    public const IDictionary<string, string> ErrorCodeDic = new Dictionary<string, string>()
    {
        { "1", "User name or password problem" }     
    };
}

Nhưng trình biên dịch phàn nàn rằng " Một trường const của kiểu tham chiếu khác với chuỗi chỉ có thể được khởi tạo bằng null ".


1
Bạn không thể sử dụng const với kiểu Từ điển, chỉ với giá trị vô hướng. (kiểm tra câu trả lời của tôi) msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx
Yona

Câu trả lời:


214

Nếu bạn muốn khai báo từ điển một lần và không bao giờ thay đổi nó thì hãy khai báo nó là chỉ đọc:

private static readonly Dictionary<string, string> ErrorCodes
    = new Dictionary<string, string>
{
    { "1", "Error One" },
    { "2", "Error Two" }
};

Nếu bạn muốn các mục từ điển được chỉ đọc (không chỉ là tham chiếu mà còn các mục trong bộ sưu tập) thì bạn sẽ phải tạo một lớp từ điển chỉ đọc để thực hiện IDictionary.

Kiểm tra ReadOnlyCollection để tham khảo.

BTW const chỉ có thể được sử dụng khi khai báo nội tuyến các giá trị vô hướng.


Làm thế nào về việc có một cấp độ lớp riêng biến tĩnh riêng tư static Dictionary <string, string> ErrorCodes và sau đó trong hàm tương ứng, hãy kiểm tra xem (ErrorCodes == null) {điền từ điển} vào giá trị bộ nhớ cache khi được sử dụng trong vòng lặp?
LifeOfPi

1
Nếu bạn không muốn từ điển bị thay đổi, bạn có thể bọc nó thành một ReadOnlyDictionary. Một tùy chọn hiệu quả hơn (nhưng kém an toàn hơn) là gán nó cho một IReadOnlyDictionaryloại.
Ramon de Klein

8

Cú pháp đúng (như được thử nghiệm trong VS 2008 SP1), là:

public static class ErrorCode
{
    public static IDictionary<string, string> ErrorCodeDic;
     static ErrorCode()
    {
        ErrorCodeDic = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
    }
}

Nhưng điều này không ngăn cản một lớp tiêu thụ sửa đổi nội dung.
Everts

4

Câu hỏi cũ, nhưng tôi thấy điều này hữu ích. Hóa ra, cũng có một lớp chuyên biệt cho Từ điển sử dụng một chuỗi cho cả khóa và giá trị:

private static readonly StringDictionary SegmentSyntaxErrorCodes = new StringDictionary
{
    { "1", "Unrecognized segment ID" },
    { "2", "Unexpected segment" }
};

Chỉnh sửa: Theo bình luận của Chris bên dưới, sử dụng Dictionary<string, string>over StringDictionarythường được ưu tiên hơn nhưng sẽ tùy thuộc vào tình huống của bạn. Nếu bạn đang xử lý cơ sở mã cũ hơn, bạn có thể bị giới hạn ở StringDictionary. Ngoài ra, hãy lưu ý rằng dòng sau:

myDict["foo"]

sẽ trả về null nếu myDictlà a StringDictionary, nhưng một ngoại lệ sẽ được ném ra trong trường hợp Dictionary<string, string>. Xem bài đăng SO mà anh ấy đề cập để biết thêm thông tin, đó là nguồn của bản chỉnh sửa này.



Đó chính xác là câu hỏi mà tôi đã liên kết.
Chris Morgan

1
Ha wow, thậm chí còn không nắm bắt được điều đó - chỉ tình cờ tìm thấy cùng một cái. Mình không chỉnh sửa được bình luận nên mình chỉ sửa bài để tóm tắt ở một chỗ. Cảm ơn!
areyling

1

Vấn đề với ví dụ ban đầu của bạn chủ yếu là do việc sử dụng constthay vì static; bạn không thể tạo tham chiếu const không null trong C #.

Tôi tin rằng điều này cũng sẽ hoạt động:

public static class ErrorCode
{
    public static IDictionary<string, string> ErrorCodeDic
        = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
}

Ngoài ra, như Y Low đã chỉ ra, việc thêm readonlycũng là một ý kiến ​​hay và không có từ bổ nghĩa nào được thảo luận ở đây sẽ ngăn chính từ điển được sửa đổi.


1

Tạo một hàm tạo tĩnh để thêm giá trị trong Từ điển

enum Commands
{
    StudentDetail
}
public static class Quires
{
    public static Dictionary<Commands, String> quire
        = new Dictionary<Commands, String>();
    static Quires()
    {
        quire.add(Commands.StudentDetail,@"SELECT * FROM student_b");
    }
}

1
câu hỏi hoặc truy vấn?
Lễ Tro

0

Đặt Từ điển thành tĩnh và không bao giờ thêm vào nó bên ngoài ctor của đối tượng tĩnh của bạn. Đó có vẻ là một giải pháp đơn giản hơn là loay hoay với các quy tắc static / const trong C #.


0

OK - vì vậy tôi đang làm việc trong ASP 2.x (không phải sự lựa chọn của tôi ... nhưng này ai đang khốn nạn?).

Không có ví dụ nào trong Từ điển khởi tạo sẽ hoạt động. Sau đó, tôi bắt gặp điều này: http://kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing-dictionaries-and-collections.aspx

... điều này đã cản trở tôi đến thực tế là không thể sử dụng khởi tạo bộ sưu tập trong ASP 2.x.


-1

Bạn có thể sử dụng hàm tạo static / class để khởi tạo từ điển của mình:

public static class ErrorCode
{
    public const IDictionary<string, string> ErrorCodeDic;
    public static ErrorCode()
    {
        ErrorCodeDic = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
    }
}

1
Ý của bạn là làm cho từ điển tĩnh? Bạn không thể có nó const. Như thông báo lỗi cho biết, chỉ có loại giá trị, chuỗi, hoặc null có thể được const
Orion Edwards

-2
public static class ErrorCode
{
    public const IDictionary<string , string > m_ErrorCodeDic;

    public static ErrorCode()
    {
      m_ErrorCodeDic = new Dictionary<string, string>()
             { {"1","User name or password problem"} };             
    }
}

Có thể là khởi tạo trong hàm tạo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.