2008-11-24 12 views
74

¿Cómo declarar un objeto de diccionario estático dentro de una clase estática? ProbéDeclarar un diccionario dentro de una clase estática

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

Pero el compilador se queja de que "Un campo const de un tipo de referencia distinto de cadena sólo puede ser inicializado con nula".

+1

No puede utilizar const con el tipo de diccionario, sólo que con valores escalares. (ver mi respuesta) http://msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx – Yona

Respuesta

173

Si desea declarar el diccionario una vez y nunca cambiarlo a continuación, la declara como de sólo lectura:

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

Si desea que los elementos del diccionario sean de solo lectura (no solo la referencia sino también los elementos de la colección), deberá crear una clase de diccionario de solo lectura que implemente IDictionary.

Consulte ReadOnlyCollection para referencia.

BTW const solo se puede utilizar al declarar valores escalares en línea.

+1

Pero esto no hace que el diccionario sea solo de lectura, solo su referencia ... –

+0

¿Qué tal tener una variable estática privada de nivel de clase privada static Dictionary ErrorCodes y luego en la comprobación de función respectiva (ErrorCodes == null) { ¿llenar el diccionario} al valor de caché cuando se usa en bucle? – 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"} };    
    } 
} 

Probablemente inicie en el constructor.

-1

Puede utilizar el constructor estático/clase para inicializar el diccionario:

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

¿Quiso decir que el diccionario estático? No puedes tenerlo const. Como dice el mensaje de error, solo pueden ser const –

0

hacen del Diccionario estático, y nunca agregar a ella fuera del ctor de su objeto estático. Esa parece ser una solución más simple que jugar con las reglas estáticas/const en C#.

8

La sintaxis correcta (según lo probado en VS 2008 SP1), es la siguiente:

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

tipos de valores, cadenas o null. Pero esto no impide que una clase consumidora modifique el contenido. – Everts

1

El problema con su ejemplo inicial se debió principalmente al uso de const en lugar de static; no puede crear una referencia de referencia no nula en C#.

Creo que esto también habría funcionado:

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

Además, como señala Y Baja, añadiendo readonly es una buena idea también, y ninguno de los modificadores discutidos aquí evitará que el propio diccionario de ser modificado.

+0

Esta es la sintaxis correcta que puede compilar – Graviton

4

Pregunta anterior, pero encontré esto útil. Resulta que, también hay una clase especializada para un diccionario usando una cadena para la clave y el valor:

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

Editar: por el comentario de Chris a continuación, utilizando Dictionary<string, string> sobre StringDictionary Generalmente se prefiere, pero dependerá de su situación. Si está tratando con una base de código anterior, puede estar limitado al StringDictionary.Además, tenga en cuenta que la siguiente línea:

myDict["foo"] 

volverá nulo si myDict es una StringDictionary, pero una excepción será lanzada en el caso de Dictionary<string, string>. Consulte el SO post he mentioned para obtener más información, que es la fuente de esta edición.

+2

[¿Por qué usaría 'StringDictionary' en lugar de' Dictionary '?] (Http://stackoverflow.com/questions/627716/stringdictionary-vs-dictionarystring-string) –

+0

Esa es exactamente la pregunta a la que me he vinculado. –

+1

Ha wow, ni siquiera capto eso - simplemente sucedió que encontré el mismo. No pude editar el comentario, así que solo edité la publicación para resumirla en un solo lugar. ¡Gracias! – areyling

1

Crear un constructor estático para agregar valores en el diccionario

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

¿pregunta o consulta? – Ash

Cuestiones relacionadas