एक स्थिर वर्ग के अंदर एक शब्दकोश घोषित करें


90

स्थिर वर्ग के अंदर एक स्थिर शब्दकोश वस्तु की घोषणा कैसे करें? मैंने कोशिश की

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

लेकिन कंपाइलर शिकायत करता है कि " स्ट्रिंग के अलावा एक संदर्भ प्रकार का एक कॉन्स्टल क्षेत्र केवल नल के साथ आरंभीकृत किया जा सकता है "।


1
आप शब्दकोश प्रकार के साथ केवल स्केलर मान के साथ कास्ट का उपयोग नहीं कर सकते। (मेरा उत्तर देखें) msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx
Yona

जवाबों:


214

यदि आप डिक्शनरी को एक बार घोषित करना चाहते हैं और इसे कभी नहीं बदलते हैं तो इसे आसानी से घोषित करें:

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

यदि आप वस्तुओं को आसानी से पढ़ाना चाहते हैं (केवल संदर्भ ही नहीं, बल्कि संग्रह में मौजूद आइटम भी) तो आपको एक पठनीय शब्दकोश वर्ग बनाना होगा जो IDfox को लागू करता है।

संदर्भ के लिए ReadOnlyCollection देखें।

बीटीडब्ल्यू कास्ट केवल स्केलर वैल्यू इनलाइन की घोषणा करते समय उपयोग किया जा सकता है।


कैसे एक वर्ग स्तर के निजी स्थिर चर निजी स्थिर शब्दकोश होने के बारे में <string, string> ErrorCodes और फिर संबंधित फ़ंक्शन की जाँच करें कि क्या (ErrorCodes == null) {भरने के लिए शब्दकोश} लूप में इस्तेमाल होने पर कैशे वैल्यू के लिए?
LifeOfPi

1
यदि आप नहीं चाहते कि शब्दकोश को बदला जाए, तो आप इसे एक में लपेट सकते हैं ReadOnlyDictionary। एक अधिक कुशल (लेकिन कम सुरक्षित विकल्प) इसे एक IReadOnlyDictionaryप्रकार से असाइन करना है ।
रेमन डे क्लेन

8

सही सिंटैक्स (जैसा कि वीएस 2008 SP1 में परीक्षण किया गया है), यह है:

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

लेकिन यह सामग्री को संशोधित करने के लिए एक उपभोग करने वाले वर्ग को नहीं रोकता है।
एवर्स

4

पुराना सवाल है, लेकिन मुझे यह उपयोगी लगा। बाहर मुड़ता है, कुंजी और मूल्य दोनों के लिए एक स्ट्रिंग का उपयोग करते हुए एक शब्दकोश के लिए एक विशेष वर्ग भी है:

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

संपादित करें: नीचे क्रिस की टिप्पणी के अनुसार, Dictionary<string, string>ओवर StringDictionaryका उपयोग करना आमतौर पर पसंद किया जाता है, लेकिन यह आपकी स्थिति पर निर्भर करेगा। यदि आप पुराने कोड आधार के साथ काम कर रहे हैं, तो आप सीमित हो सकते हैं StringDictionary। यह भी ध्यान दें कि निम्नलिखित पंक्ति:

myDict["foo"]

अगर myDictएक है StringDictionary, तो अशक्त लौट आएगा , लेकिन एक अपवाद के मामले में फेंक दिया जाएगा Dictionary<string, string>। देखें अतः पोस्ट उन्होंने कहा अधिक जानकारी है, जो इस संपादित का स्रोत है के लिए।



यह ठीक वही सवाल है, जिससे मैं जुड़ा हुआ हूं।
क्रिस मॉर्गन

1
हा वाह, यह भी नहीं पकड़ा - बस एक ही खोजने के लिए हुआ। मैं टिप्पणी को संपादित नहीं कर सका, इसलिए मैंने सिर्फ एक ही जगह संक्षेप में पोस्ट संपादित की। धन्यवाद!
areyling

1

आपके प्रारंभिक उदाहरण के साथ समस्या मुख्य रूप से constइसके बजाय के उपयोग के कारण थी static; आप C # में एक नॉन-नाल कॉन्स्ट रेफरेंस नहीं बना सकते।

मुझे विश्वास है कि इसने भी काम किया होगा:

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

इसके अलावा, जैसा कि वाई लो बताते हैं, जोड़ना readonlyएक अच्छा विचार है, और यहां चर्चा की गई कोई भी संशोधक शब्दकोश को संशोधित होने से नहीं रोक सकेगा।


1

शब्दकोश में मूल्यों को जोड़ने के लिए एक स्थिर रचनाकार बनाएँ

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
क्वायर या क्वेरी?
ऐश

0

शब्दकोश को एक स्थिर बनाएं, और इसे कभी भी अपने स्थिर ऑब्जेक्ट के ctor से बाहर न जोड़ें। ऐसा लगता है कि सी # में स्थिर / कास्ट नियमों के साथ फ़िडलिंग की तुलना में एक सरल समाधान है।


0

ठीक है - तो मैं एएसपी 2 एक्स में काम कर रहा हूं (मेरी पसंद नहीं ... लेकिन अरे जो कुतिया है?)।

आरंभिक शब्दकोश उदाहरणों में से कोई भी काम नहीं करेगा। तब मुझे यह पता चला: http://kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing-d शब्दकोशों- and- collections.aspx

... जो मुझे इस तथ्य से रूबरू कराता है कि एएसपी 2.x में संग्रह आरंभीकरण का उपयोग नहीं किया जा सकता है।


-1

आप अपने शब्दकोश को इनिशियलाइज़ करने के लिए स्टेटिक / क्लास कंस्ट्रक्टर का उपयोग कर सकते हैं:

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
क्या आपका मतलब डिक्शनरी को स्टैटिक बनाने से है? आपके पास यह नहीं हो सकता। त्रुटि संदेश दर्शाता है के रूप में, केवल मूल्य प्रकार, तार, या अशक्त स्थिरांक हो सकता है
ओरियन एडवर्ड्स

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

शायद कंस्ट्रक्टर में इनिशियलाइज़ हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.