Compartilhar via


CA1305: Especifique IFormatProvider

TypeName

SpecifyIFormatProvider

CheckId

CA1305

<strong>Categoria</strong>

Microsoft.Globalization

Alteração significativa

Não-separável

Causa

Um método ou construtor chama um ou mais membros têm sobrecargas que aceitam uma System.IFormatProvider parâmetro e o método ou construtor não chama a sobrecarga que utiliza o IFormatProvider parâmetro.Esta regra ignora chamadas para .NET Framework métodos documentados como ignorando o IFormatProvider parâmetro e além dos seguintes métodos:

Descrição da regra

Quando um System.Globalization.CultureInfo ou IFormatProvider objeto não for fornecido, o valor padrão que é fornecido pelo membro sobrecarregado não tenha o efeito desejado em todas as localidades.Além disso, .NET Framework os membros escolhem a cultura padrão e formatação com base em suposições que podem não estar corretas para o seu código.Para certificar-se de que o código funciona conforme o esperado para seus cenários, você deve fornecer informações específicas de cultura de acordo com as diretrizes a seguir:

  • Se o valor será exibido para o usuário, use a cultura atual.Consulte CultureInfo.CurrentCulture.

  • Se o valor será armazenado e acessado por software (persistida em um arquivo ou banco de dados), use a cultura invariável.Consulte CultureInfo.InvariantCulture.

  • Se você não souber o destino do valor, tem do consumidor dos dados ou provedor de especificar a cultura.

Observe que CultureInfo.CurrentUICulture é usado somente para recuperar recursos localizados por meio de uma instância da System.Resources.ResourceManager classe.

Mesmo que o comportamento padrão do membro sobrecarregado seja adequado às suas necessidades, é melhor chamar explicitamente a sobrecarga de específicos da cultura para que seu código seja documentação própria e mais facilmente mantidas.

Como corrigir violações

Para corrigir uma violação desta regra, use a sobrecarga que utiliza um CultureInfo ou IFormatProvider e especificar o argumento de acordo com as diretrizes que foram relacionados anteriormente.

Quando suprimir avisos

É seguro eliminar um aviso esta regra quando estiver certo de que o provedor de cultura/formato padrão é a opção correta e onde a capacidade de manutenção do código não é uma prioridade importante do desenvolvimento.

Exemplo

No exemplo a seguir, BadMethod faz com que dois violações desta regra.GoodMethodcorrige a primeira violação, passando a cultura invariável para Comparee corrige a segunda violação, passando a cultura atual como ToLower porque string3 é exibida ao usuário.

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));
            }
        }
    }
}

O exemplo a seguir mostra o efeito da cultura atual do padrão IFormatProvider que é selecionado pela DateTime tipo.

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);
        }
    }
}

O exemplo produz a seguinte saída.

  

Regras relacionadas

CA1304: Especifique CultureInfo

Consulte também

Conceitos

Usando a classe CultureInfo