O que é a cultura invariável?

173

Alguém poderia dar um exemplo para demonstrar o uso da cultura invariável ? Não entendo o que a documentação descreve.

Ricky
fonte
14
É inglês, mas não está associado a nenhum local.

Respostas:

132

A cultura invariável é uma cultura especial que é útil porque não muda. A cultura atual pode mudar de um usuário para outro, ou mesmo de uma execução para outra, para que você não possa confiar na mesma.

Ser capaz de usar a mesma cultura a cada vez é muito importante em vários fluxos, por exemplo, serialização: você pode ter 1,1 valor em uma cultura e 1,1 em outra. Se você tentar analisar o valor "1,1" na segunda cultura, a análise falhará. No entanto, você pode usar a cultura invariável para converter um número em uma sequência e, posteriormente, analisá-lo novamente em qualquer computador com qualquer conjunto de culturas.

// Use some non-invariant culture.
CultureInfo nonInvariantCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = nonInvariantCulture;

decimal dec = 1.1m;
string convertedToString = dec.ToString();

// Simulate another culture being used,
// following code can run on another computer.
nonInvariantCulture.NumberFormat.NumberDecimalSeparator = ",";

decimal parsedDec;

try
{
    // This fails because value cannot be parsed.
    parsedDec = decimal.Parse(convertedToString);
}
catch (FormatException)
{
}

// However you always can use Invariant culture:
convertedToString = dec.ToString(CultureInfo.InvariantCulture);

// This will always work because you serialized with the same culture.
parsedDec = decimal.Parse(convertedToString, CultureInfo.InvariantCulture);
Andrew Bezzub
fonte
9
Pelo que vale, isso está no System.Globalizationespaço para nome.
Jim H.
1
Isso sempre funcionará porque você serializou com a mesma cultura << isso não fazia sentido para mim, acho que entendi algo errado. Se usar CultureInfo.InvariantCulturefunciona porque você serializou com a mesma cultura .... então não é o mesmo que usar CultureInfo.CurrentCulture?
Alisson
3
@ Alisson Se você colocar as duas últimas instruções de código de Andrew de volta no fluxo original, acho que fará mais sentido. Se você sempre serializar usando CultureInfo.InvariantCulture, você saberá que sempre poderá analisar usando um decimal CultureInfo.InvariantCulture. Se você CultureInfo.CurrentCulturecostuma serializar, seu usuário pode ter "en-US" como a cultura atual. O próximo usuário que o analisa de volta para um decimal pode ter uma cultura atual que use "," para um separador.
precisa
1
@ Andrew Talvez eu seja tenso, mas não conseguia entender o que você estava dizendo, sem o comentário de David. Editei sua resposta para ser explícito.
jpaugh
111

Uma cultura falsa baseada no inglês com comportamento definido. É ótimo escrever, por exemplo, coisas nos arquivos de configuração para que possam ser lidos e gravados, independentemente da cultura que o usuário definiu.

Basicamente, é uma cultura específica que é artificial e não muda .

TomTom
fonte
4
Especificamente, você não será surpreendido por diferentes usos de vírgulas e pontos nas formas de seqüência de números ou por conversões de maiúsculas e minúsculas.
Steve Gilham
8
Sim ... problema típico de: * Programadores americanos que pensam que a palavra é inglês;) E depois os clientes alemães escrevem 1.000,00 por 1000;) Ouch. * Mesmo no mesmo idioma, Suíça e Alemanha, por exemplo, usam "." e "," de diferentes maneiras em números. Resultado -> Arquivos de configuração são lixo. Use a linguagem invariante lá;)
TomTom
23
Para adicionar ao comentário de Steve: é a cultura a ser usada quando você realmente não se importa com a aparência das coisas (você não se importa se usa vírgulas ou pontos ou qualquer outra coisa, porque o usuário nunca verá), mas você sempre precisa disso para ser o mesmo (por exemplo, porque você precisa ler o que escreveu).
itowlson #
7

É usado para coisas iguais, independentemente da cultura (que não precisa ser traduzida para alguma cultura X para ser apropriada)

como por exemplo - https://msdn.microsoft.com/en-us/library/4c5zdc6a(v=vs.100).aspx . Ao escrever um arquivo específico do aplicativo com o qual o usuário não deve estar brincando, use o InvariantCulture para todos os métodos que usam um parâmetro de cultura.

Observe que, de acordo com os documentos vinculados acima:

No entanto, um aplicativo deve usar a cultura invariável apenas para processos que exijam resultados independentes da cultura, como formatação e análise de dados persistentes em um arquivo.

Gishu
fonte
3
Isso diz ao corolário que a cultura invariante se destina apenas a ser um formato intermediário, ou seja, se você estiver exibindo coisas para o usuário que são a saída da cultura invariante (ou seja, 'na' cultura invariante), você estará fazendo algo errado e não entende a cultura invariável.
mlhDev
3

A cultura invariável é insensível à cultura; está associado ao idioma inglês, mas não a nenhum país / região.

CultureInfo.InvariantCulture recupera uma instância da cultura invariável. Ele pode ser usado em praticamente qualquer método no espaço para nome System.Globalization que requer uma cultura.

Os objetos retornados por propriedades como CompareInfo, DateTimeFormat e NumberFormat também refletem as convenções de comparação e formatação de string da cultura invariável. A propriedade InvariantCulture é útil quando você deseja exibir dados persistentes em um formato independente da cultura .

Por exemplo, se você deseja exibir um número ou data e hora em um formato específico, independentemente da cultura atual do aplicativo, é possível usar CultureInfo.InvariantCulture .

CharithJ
fonte
0

É um idioma inglês universal simples, não regional e universal, e outras informações relacionadas. É como a linguagem da própria linguagem de programação. Você pode confiar nele para configurar um calendário universal; na situação em que você precisa gerar nomes de controladores, URLs, delegar nomes ... etc. e precisa de coisas para agir natural e universalmente entre todos os usuários.

Shadi Namrouti
fonte