Partilhar via


CA1305: especificar IFormatProvider

TypeName

SpecifyIFormatProvider

CheckId

CA1305

Categoria

Microsoft.Globalization

Alteração Significativa

Sem quebra

Causa

Um método ou um construtor chamam um ou mais membros que têm as sobrecargas que aceitam um parâmetro de IFormatProvider , e o método ou o construtor não chama a sobrecarga que usa o parâmetro de IFormatProvider .Esta regra ignora chamadas para os métodos de .NET Framework que são documentados como ignorar o parâmetro de IFormatProvider e adicionalmente os seguintes métodos:

Descrição da Regra

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

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

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

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

Observe que CultureInfo.CurrentUICulture é usado para recuperar apenas recursos encontrados usando uma instância da classe de ResourceManager .

Se o comportamento padrão do membro sobrecarregado é apropriado para suas necessidades, é melhor chamar explicitamente a sobrecarga cultura específica para que seu código do seja documentando e mantido mais facilmente.

Como Corrigir Violações

Para corrigir uma violação desta regra, use a sobrecarga necessária CultureInfo ou IFormatProvider e especifique o argumento de acordo com as diretrizes que foi listada anteriormente.

Quando Suprimir Alertas

É seguro suprimir um aviso desta regra quando você tiver certeza de que o provedor padrão de cultura/formato é a escolha correta e onde a manutenibilidade de código não é uma prioridade importante de desenvolvimento.

Exemplo

No exemplo a seguir, BadMethod causa duas violações desta regra.GoodMethod corrigir a primeira violação passando a cultura invariável a Compare, e corrigir a segunda violação passando a cultura atual a ToLower porque string3 é exibido 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 da opção IFormatProvider que é selecionada pelo tipo de 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);
        }
    }
}

O exemplo produz a seguinte saída.

  

Regras Relacionadas

CA1304: especificar CultureInfo

Consulte também

Outros recursos

Usando a classe CultureInfo