2008-11-24 20 views
74

Come dichiarare un oggetto dizionario statico all'interno di una classe statica? Ho provatoDichiarare un dizionario all'interno di una classe statica

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

Ma il compilatore segnala che "Un campo const di un tipo di riferimento diverso stringa può essere inizializzata solo con null".

+1

Non è possibile utilizzare const con il tipo di dizionario, solo con valori scalari. (controlla la mia risposta) http://msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx – Yona

risposta

173

Se volete dichiarare il dizionario una volta e mai cambiare poi dichiararla come sola lettura:

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

Se si desidera che gli elementi del dizionario siano di sola lettura (non solo il riferimento ma anche gli elementi nella raccolta), sarà necessario creare una classe dizionario di sola lettura che implementa IDictionary.

Controllare ReadOnlyCollection come riferimento.

BTW const può essere utilizzato solo quando si dichiarano valori scalari in linea.

+1

Ma questo non rende il dizionario di sola lettura, solo il suo riferimento ... –

+0

Che ne dici di avere un dizionario statico privato a livello di classe privato statico privato ErrorCodes e poi nella rispettiva funzione controlla se (ErrorCodes == null) { riempire dizionario} per memorizzare il valore quando usato in loop? – 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"} };    
    } 
} 

Inizializzazione probabilmente nel costruttore.

-1

È possibile utilizzare il costruttore statico/classe per inizializzare il dizionario:

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

Intendevi rendere statico il dizionario? Non puoi averlo const. Come dice il messaggio di errore, solo i tipi di valore, stringhe o null possono essere const –

0

Fai Dizionario statico, e mai aggiungere ad essa al di fuori del tto del vostro oggetto statico. Sembra essere una soluzione più semplice di quella con le regole static/const in C#.

8

La sintassi corretta (come testato in VS 2008 SP1), è questa:

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

Ma ciò non impedisce a una classe che consuma di modificare il contenuto. – Everts

1

Il problema con il tuo esempio iniziale era principalmente dovuto all'uso di const anziché static; non è possibile creare un riferimento const non null in C#.

Credo che questo avrebbe anche funzionato:

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

Inoltre, come sottolinea Y bassa, aggiungendo readonly è una buona idea pure, e nessuno dei modificatori discussi qui impedirà il dizionario in se ad essere modificata.

+0

Questa è la sintassi corretta che può compilare – Graviton

4

Vecchia domanda, ma ho trovato questo utile. Risulta, c'è anche una classe specializzata per un Dizionario utilizzando una stringa sia per la chiave e il valore:

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

Edit: Per il commento di Chris di seguito, utilizzando Dictionary<string, string> sopra StringDictionary è generalmente preferito, ma dipenderà dalla vostra situazione. Se hai a che fare con una base di codice meno recente, potresti essere limitato allo StringDictionary.Si noti inoltre che la seguente riga:

myDict["foo"] 

restituirà null se myDict è un StringDictionary, ma un'eccezione saranno gettati in caso di Dictionary<string, string>. Vedere lo SO post he mentioned per ulteriori informazioni, che è la fonte di questa modifica.

+2

[Perché dovresti usare 'StringDictionary' piuttosto che' Dictionary '?] (Http://stackoverflow.com/questions/627716/stringdictionary-vs-dictionarystring-string) –

+0

Questa è esattamente la domanda a cui mi sono collegato. –

+1

Ha wow, non l'ha nemmeno capito - è successo a trovare lo stesso. Non ho potuto modificare il commento, quindi ho solo modificato il post per riassumere in un unico posto. Grazie! – areyling

1

Creare un costruttore statico per aggiungere i valori nel Dizionario

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

quire o query? – Ash

Problemi correlati