Compartir a través de


CA1305: Especificar IFormatProvider

Nombre de tipo

SpecifyIFormatProvider

Identificador de comprobación

CA1305

Categoría

Microsoft.Globalization

Cambio problemático

Poco problemático

Motivo

Un método o constructor llama a uno o más miembros que tiene sobrecargas que aceptan un parámetro System.IFormatProvider, y el método o constructor no llama a la sobrecarga que toma el parámetro IFormatProvider.Esta regla omite las llamadas a métodos de .NET Framework que se documentan omitiendo el parámetro IFormatProvider y junto con los métodos siguientes:

Descripción de la regla

Si no se proporciona un objeto System.Globalization.CultureInfo o IFormatProvider, el valor predeterminado proporcionado por el miembro sobrecargado podría no surtir el efecto deseado en todas las variables locales.Además, los miembros de .NET Framework eligen la referencia cultural predeterminada y dan formato basándose en suposiciones que podrían ser incorrectas para su código.Para asegurarse de que el código funciona como se espera para sus escenarios, debería proporcionar la información específica de la referencia cultural según las instrucciones siguientes:

  • Si el valor se muestra al usuario, utilice la referencia cultural actual.Vea CultureInfo.CurrentCulture.

  • Si el valor se almacena y se obtiene acceso a él mediante software (almacenado en un archivo o base de datos) utilice la referencia cultural para todos los idiomas.Vea CultureInfo.InvariantCulture.

  • Si no conoce el destino del valor, haga que el consumidor o proveedor de datos especifique la referencia cultural.

Observe que CultureInfo.CurrentUICulture solo se utiliza para recuperar recursos adaptados mediante una instancia de la clase System.Resources.ResourceManager.

Incluso si el comportamiento predeterminado del miembro sobrecargado es adecuado para sus necesidades, es mejor llamar explícitamente a la sobrecarga específica de la referencia cultural para que el código se autodocumente y se mantenga de forma más sencilla.

Cómo corregir infracciones

Para corregir una infracción de esta regla, utilice la sobrecarga que toma un CultureInfo o IFormatProvider y especifique el argumento siguiendo las instrucciones mostradas anteriormente.

Cuándo suprimir advertencias

Es seguro suprimir una advertencia de esta regla cuando el proveedor de formato/referencia cultural predeterminado sea la elección correcta y donde el mantenimiento del código no sea una prioridad de desarrollo importante.

Ejemplo

En el ejemplo siguiente, BadMethod causa dos infracciones de esta regla.GoodMethod corrige la primera infracción pasando la referencia cultural de todos los idiomas a Compare y corrige la segunda infracción pasando la referencia cultural actual a ToLower puesto que string3 se muestra al usuario.

using System;
using System.Globalization;

namespace GlobalizationLibrary
{
    public class CultureInfoTest
    {
        public void BadMethod(String string1, String string2, String string3)
        {
            if(string.Compare(string1, string2, false) == 0)
            {
                Console.WriteLine(string3.ToLower());
            }
        }

        public void GoodMethod(String string1, String string2, String string3)
        {
            if(string.Compare(string1, string2, false, 
                              CultureInfo.InvariantCulture) == 0)
            {
                Console.WriteLine(string3.ToLower(CultureInfo.CurrentCulture));
            }
        }
    }
}

El ejemplo siguiente muestra el efecto de la referencia cultural actual en el IFormatProvider predeterminado seleccionado por el tipo DateTime.

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

namespace GlobalLibGlobalLibrary
{
    public class IFormatProviderTest
    {
        public static void Main()
        {
            string dt = "6/4/1900 12:15:12";

            // The default behavior of DateTime.Parse is to use
            // the current culture.

            // Violates rule: SpecifyIFormatProvider.
            DateTime myDateTime = DateTime.Parse(dt);
            Console.WriteLine(myDateTime);

            // Change the current culture to the French culture,
            // and parsing the same string yields a different value.

            Thread.CurrentThread.CurrentCulture = new CultureInfo("Fr-fr", true);
            myDateTime = DateTime.Parse(dt);

            Console.WriteLine(myDateTime);
        }
    }
}

Este ejemplo produce el siguiente resultado.

  

Reglas relacionadas

CA1304: Especificar CultureInfo

Vea también

Conceptos

Utilizar la clase CultureInfo