2008-11-24 25 views
74

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

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

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

+1

आप केवल अदिश मूल्यों के साथ, शब्दकोश प्रकार के साथ स्थिरांक उपयोग नहीं कर सकते में मान जोड़ने के लिए एक स्थिर निर्माता बनाएँ। (मेरा उत्तर जांचें) http://msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx – Yona

उत्तर

173

आप एक बार शब्दकोश घोषित करने के लिए और परिवर्तन यह तो यह रूप केवल पढ़ने के लिए की घोषणा कभी नहीं चाहते हैं:

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

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

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

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

+1

लेकिन यह केवल शब्दकोश पढ़ने को नहीं बनाता है, बस इसका संदर्भ है ... –

+0

कक्षा स्तर निजी स्थैतिक चर निजी स्थिर शब्दकोश <स्ट्रिंग, स्ट्रिंग> त्रुटि कोड और फिर संबंधित फ़ंक्शन में कैसे जांचें (ErrorCodes == null) { लूप में उपयोग किए जाने पर कैश मान को शब्दकोश} भरें? – Prathyush

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

शायद कन्स्ट्रक्टर में प्रारंभ होता है।

-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

क्या आप शब्दकोश को स्थिर बनाना चाहते हैं? आप इसे स्थिर नहीं कर सकते हैं। चूंकि त्रुटि संदेश कहता है, केवल मान प्रकार, तार या शून्य शून्य –

0

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

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

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

1

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

मेरा मानना ​​है कि यह भी काम किया होता:

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

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

+0

यह सही वाक्यविन्यास है जो – Graviton

0

ठीक है - इसलिए मैं एएसपी 2.x में काम कर रहा हूं (मेरी पसंद नहीं ... लेकिन हे, जो कुचलना है?)।

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

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

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> के मामले में फेंक दिया जाएगा। अधिक जानकारी के लिए SO post he mentioned देखें, जो इस संपादन का स्रोत है।

+2

संकलित कर सकता है [आप 'शब्दकोश <स्ट्रिंग, स्ट्रिंग> '?] के बजाय' स्ट्रिंग डिक्शनरी' का उपयोग क्यों करेंगे (http://stackoverflow.com/questions/627716/stringdictionary-vs-dictionarystring-string) –

+0

यह वही सवाल है जिसे मैंने लिंक किया था। –

+1

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

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"); 
    } 
} 
+0

पूछताछ या क्वेरी? – Ash

संबंधित मुद्दे