2010-07-07 18 views
29

¿Es esta una forma apropiada de manejar declaraciones de interruptor C# o se requiere una interrupción explícita aún? referenceC# declaración de conmutación es adecuada para reemplazar la ruptura

public static string ToRegistryString(AliceKey.AliceKeyPaths aliceKeyPath) 
    { 
    switch (aliceKeyPath) 
     { 
      case AliceKey.AliceKeyPaths.NET_CLR_DATA: 
       return @"\.NET CLR Data\"; 
      case AliceKey.AliceKeyPaths.NET_CLR_NETWORKING: 
       return @"\.NET CLR Networking\"; 
      case AliceKey.AliceKeyPaths.NET_DATA_PROVIDER_MSSQL: 
       return @"\.NET Data Provider for SqlServer\"; 
      case AliceKey.AliceKeyPaths.NET_DATA_PROVIDER_ORACLE: 
       return @"\.NET Data Provider for Oracle\"; 
     } 
     return new string(new char[0]); 
    } 
+0

En lugar de poner "retorno nueva cadena (nuevo char [0]);" fuera de la declaración de cambio también puede usar "predeterminado: devolver una nueva cadena (nueva char [0]);" caso después de todos los otros casos. Será una forma más limpia de usar la declaración Switch. – FrozZerrer

Respuesta

40

Eso está bien. El punto es que el final de un bloque de casos no debe ser alcanzado, que está aquí, porque has regresado.

¿Por qué regresas new string(new char[0]) en lugar de solo "" o string.Empty? Si intenta asegurarse de que sea una cadena diferente cada vez, se encontrará con un caso de esquina muy extraño: a pesar de llamar al new string(...) ese código siempre devolverá la misma referencia ...

Finalmente: lo haría en realidad sugerir cambiar este bloque switch/case en sólo un Dictionary<AliceKey.AliceKeyPaths, string>:

private static readonly Dictionary<AliceKey.AliceKeyPaths, string> RegistryMap = 
    new Dictionary<AliceKey.AliceKeyPaths, string> 
{ 
    { AliceKey.AliceKeyPaths.NET_CLR_DATA, @"\.NET CLR Data\" }, 
    { AliceKey.AliceKeyPaths.NET_CLR_NETWORKING, @"\.NET CLR Networking\" }, 
    // etc 
}; 

public static string ToRegistryString(AliceKey.AliceKeyPaths aliceKeyPath) 
{ 
    string value; 
    return RegistryMap.TryGetValue(aliceKeyPath, out value) ? value : ""; 
} 
+0

Sabía que había algo mucho más simple que eso, gracias – Woot4Moo

Cuestiones relacionadas