2012-08-13 9 views
12

Tengo un clasificador que realiza varias comparaciones. Resharper dice que debería cambiar de String.CompareTo a String.CompareOrdinal. ¿Esto realmente proporciona muchos beneficios o es algo para lo que debo ajustar las reglas de inspección?Resharper recomienda cambiar CompareTo a CompareOrdinal

CompareTo:

config.Sort(delegate(configData data1, configData data2) 
{ 
    if (data1.SettingName.Equals(data2.SettingName)) 
    { 
     string m1 = data1.SettingMachine; 
     string m2 = data2.SettingMachine; 
     if (m1 == null) 
      m1 = string.Empty; 
     if (m2 == null) 
      m2 = string.Empty; 
     return m1.CompareTo(m2); 
    } 

    return data1.SettingName.CompareTo(data2.SettingName); 
}); 

CompareOrdinal:

config.Sort(delegate(configData data1, configData data2) 
{ 
    if (data1.SettingName.Equals(data2.SettingName)) 
    { 
     string m1 = data1.SettingMachine; 
     string m2 = data2.SettingMachine; 
     if (m1 == null) 
      m1 = string.Empty; 
     if (m2 == null) 
      m2 = string.Empty; 
     return String.CompareOrdinal(m1, m2); ; 
    } 

    return String.CompareOrdinal(data1.SettingName, data2.SettingName); 
}); 
+0

La advertencia es "CompareTo es específico de la cultura" –

+0

También relacionado: http://stackoverflow.com/questions/10941375/could-string-comparisons-really-differ-based-on-culture-when-the-string- is-guara –

+0

Por lo tanto, desde un punto de vista de la resharper parece recomendarlo teniendo en cuenta la cultura – Adam

Respuesta

17

ReSharper le preocupa que si tuviera que ejecutar su código en un sistema de que usaba una codificación de caracteres predeterminada diferente, la comparación podría fallar. CompareOrdinal es invariante de cultura, eliminando así el problema.

+1

Sí, es realmente mejor. He visto muchas veces cuando la comparación de cadenas tiene lugares "Bog" en "Bóg" o viceversa, simplemente dependiendo del idioma del sistema operativo, y hubo diferencias entre el orden de clasificación generado por la base de datos y la aplicación cliente. A veces esto no es importante, pero si está generando, es decir, un calendario de pagos, bueno ... :) – quetzalcoatl

+0

Gracias, esto es lo que estaba buscando aprender. – Adam

0

Mi conjetura es que ReSharper está tratando de prevenir nulas referencias.

¿Qué pasaría si data1 o data2 es nulo al usar el primer fragmento de código? Compare esto con el segundo fragmento de código.

Es un poco más seguro de esta manera.

EDITAR

En ambos fragmentos, la primera if fracasarían, pero me refiero a las partes Compare, por supuesto :)

+0

Resharper es bastante inteligente: también sabría (como lo mencionó) que el 'si' arrojaría primero una excepción de referencia nula - es seguro que será un problema relacionado con la cultura. –

Cuestiones relacionadas