Usando a propriedade InvariantCulture
O InvariantCulture propriedade representa um neutro nem uma cultura específica. Ele representa um terceiro tipo de cultura faz diferenciação de cultura. Ele está associado com o idioma inglês, mas não com um país ou região. Seus aplicativos podem usar essa propriedade com quase qualquer método no System.Globalization namespace que requer uma cultura. No entanto, um aplicativo deve usar a cultura invariável somente para processos que exigem resultados independente de cultura, como, por exemplo, formatação e análise de dados são mantidos em um arquivo. Em outros casos, ele produz resultados que podem estar lingüisticamente incorretos ou culturalmente inadequado.
Considerações sobre segurança
Se uma decisão de segurança será feita com base no resultado de uma comparação de seqüência de caracteres ou caso alterar, seu aplicativo deve usar uma comparação ordinal que diferencia maiúsculas de minúsculas em vez de usar InvariantCulture. As implementações padrão de métodos como String.Compare e String.ToUpper usar o CurrentCulture propriedade. Código que executa operações de cadeia de caracteres de cultura pode causar vulnerabilidades de segurança se CurrentCulture é alterado ou se a cultura do computador que executa o código difere da cultura usada para testar o código. O comportamento esperado ao escrever uma operação de seqüência de caracteres difere do comportamento real do seu código no computador em execução. Em contraste, uma comparação ordinal depende exclusivamente o valor binário dos caracteres comparados.
Seqüência de operações
Se o seu aplicativo precisa realizar uma operação de seqüência de caracteres de cultura não é afetada pelo valor do CurrentCulture, ele deve usar um método que aceita um CultureInfo parâmetro. O aplicativo deve especificar o valor de InvariantCulture propriedade para esse parâmetro. O aplicativo deve usar a propriedade com métodos como String.Compare e String.ToUpper para eliminar a variações culturais e garantir resultados consistentes. Para obter mais informações sobre como usar o InvariantCulture propriedade para executar operações de cadeia de caracteres com diferenciação de cultura, consulte As operações de cadeia de caracteres com diferenciação de cultura.
Persistência de dados
O InvariantCulture propriedade é útil para armazenar dados que não serão exibidos diretamente para os usuários. Armazenar dados em um formato independente de cultura garante um formato conhecido que não é alterado. Quando os usuários de diferentes culturas acessam os dados, pode ser formatado adequadamente, com base no usuário específico. Por exemplo, se o aplicativo armazena DateTime tipos de um arquivo de texto formatados para a cultura invariável, o aplicativo deve usar o InvariantCulture propriedade ao chamar ToString para armazenar as seqüências de caracteres e o Parse método para recuperar seqüências de caracteres. Esta técnica garante que os valores subjacentes a DateTime tipos de não alterar quando os dados é lido ou gravados por usuários de diferentes culturas.
O exemplo de código a seguir demonstra como inicializar um CultureInfo o objeto com a cultura invariável usando uma seqüência vazia ("") ou InvariantCulture.
' The following lines are equivalent.
CultureInfo Invc = New CultureInfo("")
CultureInfo Invc = CultureInfo.InvariantCulture
// The following lines are equivalent.
CultureInfo Invc = New CultureInfo("");
CultureInfo Invc = CultureInfo.InvariantCulture;
O exemplo de código a seguir ilustra a escrever um DateTime o objeto em um arquivo como uma seqüência de caracteres formatada para a cultura invariável usando o ToString método. A seqüência de caracteres é então ler o arquivo no formato cultura invariável e analisada para um DateTime de objeto usando o Parse método. O DateTime objeto é, em seguida, formatado e exibido para a cultura "fr-FR" e "ja-JP".
Imports System
Imports System.IO
Imports System.Globalization
Imports Microsoft.VisualBasic
Public Class TextToFile
Private const FILE_NAME As String = "MyDateFile.txt"
Public Shared Sub Main()
If File.Exists(FILE_NAME) Then
Console.WriteLine("{0} already exists!", FILE_NAME)
Return
End If
Dim sw As StreamWriter = File.CreateText(FILE_NAME)
'Creates a DateTime.
Dim dtIn As DateTime = DateTime.Now
Dim InvC As CultureInfo = CultureInfo.InvariantCulture
' Writes the string to the file formatted for InvariantCulture.
sw.WriteLine(dtIn.ToString("d", InvC))
sw.Close()
If Not File.Exists(FILE_NAME) Then
Console.WriteLine("{0} does not exist!", FILE_NAME)
Return
End If
Dim sr As StreamReader = File.OpenText(FILE_NAME)
Dim filedate As String
filedate = sr.Readline()
While Not filedate Is Nothing
Console.WriteLine(ControlChars.Newline + "The date stored in _
the file formatted for the invariant culture is:" + _
ControlChars.Newline + " {0}", filedate )
' Creates a new DateTime and parses the
' string stored in the file.
Dim dtout as DateTime = DateTime.Parse(filedate, InvC)
' Creates a CultureInfo set to "fr-FR".
Dim frc As New CultureInfo("fr-FR")
' Displays the date formatted for the "fr-FR" culture.
Console.WriteLine(ControlChars.Newline + "The date read from _
the file and formatted for the culture ""fr-FR"" is:" + _
ControlChars.Newline + " {0}", dtout.ToString("d", frc))
' Creates a CultureInfo set to "ja-JP".
Dim jpn As New CultureInfo("ja-JP")
' Displays the date formatted for the "ja-JP" culture.
Console.WriteLine(ControlChars.Newline + "The date read from _
the file and formatted for the culture ""ja-JP"" is:" + _
ControlChars.Newline + " {0}", dtout.ToString("d", jpn))
filedate = sr.Readline()
End While
Console.WriteLine(ControlChars.Newline + "The end of the stream _
has been reached.")
sr.Close()
End Sub
End Class
using System;
using System.IO;
using System.Globalization;
public class TextToFile
{
private const string FILE_NAME = "MyDateFile.txt";
public static void Main(String[] args)
{
if (File.Exists(FILE_NAME))
{
Console.WriteLine("{0} already exists!", FILE_NAME);
return;
}
StreamWriter sw = File.CreateText(FILE_NAME);
// Creates a DateTime.
DateTime dtIn = DateTime.Now;
// Creates a CultureInfo set to InvariantCulture.
CultureInfo InvC = new CultureInfo("");
// Converts dt to a string formatted for InvariantCulture,
// and writes it to a file.
sw.WriteLine (dtIn.ToString("d",InvC));
sw.Close();
if (!File.Exists(FILE_NAME))
{
Console.WriteLine("{0} does not exist!", FILE_NAME);
return;
}
StreamReader sr = File.OpenText(FILE_NAME);
String date;
while ((date=sr.ReadLine())!=null)
{
Console.WriteLine("\nThe date stored in the file formatted for
the invariant culture is:\n{0}" , date);
// Parses the string stored in the file,
// and stores it in a DateTime.
DateTime dtout = DateTime.Parse(date, InvC);
// Creates a CultureInfo set to "fr-FR".
CultureInfo frc = new CultureInfo("fr-FR");
// Displays the date formatted for the "fr-FR" culture.
Console.WriteLine("\nThe date read from the file and formatted
for the culture \"fr-FR\" is:\n{0}" , dtout.ToString("d",
frc));
// Creates a CultureInfo set to "ja-JP".
CultureInfo jpn= new CultureInfo("ja-JP");
// Displays the date formatted for the "ja-JP" culture.
Console.WriteLine("\nThe date read from the file and formatted
for the culture \"ja-JP\" is:\n{0}" , dtout.ToString("d",
jpn));
}
Console.WriteLine ("\nThe end of the stream has been reached.");
sr.Close();
}
}
Esse código produz a seguinte saída:
The date stored in the file formatted for the invariant culture is:
07/24/2001
The date read from the file and formatted for the culture "fr-FR" is:
24/07/2001
The date read from the file and formatted for the culture "ja-JP" is:
2001/07/24
The end of the stream has been reached.