2011-04-04 16 views
6

Me he estado preguntando sobre este durante bastante tiempo, pero parece que no puedo encontrar una respuesta definitiva. Siempre que puedo convertir un entero a una cadena utilizando el método ToString(), y corro un análisis de código, aparece el siguiente aviso:Usando Int32.ToString() sin Formato e IFormatProvider. ¿Por qué recibo la advertencia CA1305?

CA1305: Microsoft.Globalization: Debido a que el comportamiento de 'int.ToString()' podría variar según la configuración regional actual del usuario , reemplace esta llamada en 'Class.Method()' con una llamada a 'int.ToString (IFormatProvider)'. Si el resultado de 'int.ToString ( IFormatProvider)' se mostrará en el usuario, especifique 'CultureInfo.CurrentCulture' como el parámetro 'IFormatProvider'. De lo contrario, si el resultado será almacenado y accedido por software, tales como cuando se conserva en el disco o en una base de datos, especifique 'CultureInfo.InvariantCulture'.

Ésta es la muy conocida advertencia CA1305 genérica, que consigue muestra cada vez que hagas una llamada a un método que tiene una sobrecarga que acepta un parámetro IFormatProvider. Si bien esta es una advertencia muy correcta en casi todos los casos, no puedo pensar en nada que pueda salir mal al llamar al predeterminado ToString()sin ningún formato o formato de proveedor en un número entero. Entonces, por favor, si alguien sabe algo que podría salir mal, ilumíname. Supongo que debe haber una buena razón para la sobrecarga IFormatProvider.

Por cierto, I do siempre hace la llamada usando la sobrecarga IFormatProvider, porque también parece tener un beneficio de rendimiento. Si alguien tiene comentarios perspicaces sobre esto, siéntete libre de compartirlos también.

Respuesta

9

Hay cosas que yo imaginar podría fácilmente afectar el resultado:

  • si los dígitos son sustituidos (no estoy seguro si esto afecta a ToString)
  • Si los dígitos se agrupan (no estoy seguro si NumberFormatInfo se vez dígitos de grupo en un entero solo de este tipo de llamada ToString)
  • El signo negativo (esto podría fácilmente ser significativos)

corto pero completo ejemplo de cómo podría afectar a las cosas, el uso de la propiedad NegativeSign:

using System; 
using System.Globalization; 
using System.Threading; 

class Test 
{ 
    static void Main() 
    { 
     int x = -10; 
     Console.WriteLine(x.ToString()); 

     CultureInfo culture = Thread.CurrentThread.CurrentCulture; 
     // Make a writable clone 
     culture = (CultureInfo) culture.Clone(); 
     culture.NumberFormat.NegativeSign = "!!!"; 

     Thread.CurrentThread.CurrentCulture = culture; 
     Console.WriteLine(x.ToString()); 
    } 
} 

Salida:

-10 
!!!10 
+0

ejemplo muy claro, gracias. No sabía que los signos negativos podrían diferir por cultura. –

3

Si se echa un vistazo en el NumberFormatInfo Class, verá que algunas propiedades se aplica a enteros, como PositiveSign o Separadores de grupo, por ejemplo.

3

Incluso si el formato en realidad no difiere entre culturas, recibe la advertencia porque en realidad está haciendo una llamada utilizando información cultural que parece que no contiene ninguna información cultural.A la advertencia no le preocupa tanto si la información cultural hace alguna diferencia, sino que el código oculta la información de que la información cultural se usa en absoluto.

La llamada sin parámetros a ToString hará una llamada al ToString(CultureInfo.CurrentCulture). La llamada sin parámetros oculta esta información, por lo que debe realizar la llamada en la que muestre qué información cultural es la que desea usar en la llamada.

+0

Estoy de acuerdo con su argumento sobre la ocultación, aunque sigo pensando que la advertencia se refiere a la diferencia cultural: 'Debido a que el comportamiento de' int.ToString() 'podría variar según la configuración regional actual del usuario ...' –

+1

@Rewinder: The El hecho de que el resultado varíe debido a la configuración no es un problema, aún lo haría si especifica 'CultureInfo.CurrentCulture', es que el uso de la cultura está oculto, ese es el problema. – Guffa

0

Hay cosas que yo imaginar podría fácilmente afectar el resultado:

  • si los dígitos son sustituidos (no estoy seguro si esto afecta a ToString)

  • Si los dígitos se agrupan (no estoy seguro si NumberFormatInfo Alguna vez
    dígitos del grupo en un entero solo de este tipo de llamada ToString)

  • El signo negativo (esto podría ser fácilmente significativo)

    using System; 
        using System.Globalization; 
        using System.Threading; 
    
        class Test 
        { 
        static void Main() 
        { 
         int x = -10; 
         Console.WriteLine(x.ToString()); 
    
         CultureInfo culture = Thread.CurrentThread.CurrentCulture; 
        // Make a writable clone 
         culture = (CultureInfo) culture.Clone(); 
        culture.NumberFormat.NegativeSign = "!!!"; 
    
        Thread.CurrentThread.CurrentCulture = culture; 
        Console.WriteLine(x.ToString()); 
        } 
        } 
    
Cuestiones relacionadas