System.Globalization.CultureInfo.InvariantCulture 属性
本文提供了此 API 参考文档的补充说明。
固定区域性不区分区域性;它与英语相关联,但不与任何国家/地区相关联。 通过在对实例化方法的调用 CultureInfo 中使用空字符串(“”)指定固定区域性。 此属性 CultureInfo.InvariantCulture还会检索固定区域性的实例。 它几乎可以在需要区域性的 System.Globalization 命名空间中的任何方法中使用。 由属性(如 CompareInfo) DateTimeFormat返回的对象,还 NumberFormat 反映了固定区域性的字符串比较和格式设置约定。
与区域性敏感数据不同,由于用户自定义或对 .NET Framework 或操作系统的更新而更改,随着时间推移和安装区域性之间的固定区域性数据保持稳定,并且用户无法自定义。 这使得固定区域性对于需要独立于区域性的结果的操作特别有用,例如格式化和分析保留格式化数据的操作,或排序和排序操作,这些操作要求无论区域性如何,都以固定顺序显示数据。
字符串操作
可以将固定区域性用于不受当前区域性约定影响且跨区域性保持一致的区域性敏感字符串操作。 例如,你可能希望已排序的数据按固定顺序显示,或者对字符串应用一组标准大小写约定,而不管当前区域性如何。 为此,请将对象传递给 InvariantCulture 具有 CultureInfo 参数的方法,例如 Compare(String, String, Boolean, CultureInfo) 和 ToUpper(CultureInfo)。
持久保存数据
该 InvariantCulture 属性可用于以独立于区域性的格式保存数据。 这提供了一种不更改的已知格式,可用于跨区域性序列化和反序列化数据。 反序列化数据后,可以根据当前用户的文化约定对数据进行适当的格式设置。
例如,如果选择以字符串形式保存日期和时间数据,则可以将该InvariantCulture对象传递给或DateTimeOffset.ToString(IFormatProvider)方法以创建字符串,并且可以将该InvariantCulture对象传递给DateTime.Parse(String, IFormatProvider)或DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles)方法以将字符串转换DateTime.ToString(String, IFormatProvider)回日期和时间值。 此方法可确保从不同区域性读取或写入数据时,基础日期和时间值不会更改。
以下示例使用固定区域性将值保留 DateTime 为字符串。 然后,它使用法国(法国)和德国(德国)文化的格式设置约定分析字符串并显示其值。
using System;
using System.IO;
using System.Globalization;
public class Example
{
public static void Main()
{
// Persist the date and time data.
StreamWriter sw = new StreamWriter(@".\DateData.dat");
// Create a DateTime value.
DateTime dtIn = DateTime.Now;
// Retrieve a CultureInfo object.
CultureInfo invC = CultureInfo.InvariantCulture;
// Convert the date to a string and write it to a file.
sw.WriteLine(dtIn.ToString("r", invC));
sw.Close();
// Restore the date and time data.
StreamReader sr = new StreamReader(@".\DateData.dat");
String input;
while ((input = sr.ReadLine()) != null)
{
Console.WriteLine("Stored data: {0}\n" , input);
// Parse the stored string.
DateTime dtOut = DateTime.Parse(input, invC, DateTimeStyles.RoundtripKind);
// Create a French (France) CultureInfo object.
CultureInfo frFr = new CultureInfo("fr-FR");
// Displays the date formatted for the "fr-FR" culture.
Console.WriteLine("Date formatted for the {0} culture: {1}" ,
frFr.Name, dtOut.ToString("f", frFr));
// Creates a German (Germany) CultureInfo object.
CultureInfo deDe= new CultureInfo("de-De");
// Displays the date formatted for the "de-DE" culture.
Console.WriteLine("Date formatted for {0} culture: {1}" ,
deDe.Name, dtOut.ToString("f", deDe));
}
sr.Close();
}
}
// The example displays the following output:
// Stored data: Tue, 15 May 2012 16:34:16 GMT
//
// Date formatted for the fr-FR culture: mardi 15 mai 2012 16:34
// Date formatted for de-DE culture: Dienstag, 15. Mai 2012 16:34
Imports System.Globalization
Imports System.IO
Module Example
Public Sub Main()
' Persist the date and time data.
Dim sw As New StreamWriter(".\DateData.dat")
' Create a DateTime value.
Dim dtIn As DateTime = DateTime.Now
' Retrieve a CultureInfo object.
Dim invC As CultureInfo = CultureInfo.InvariantCulture
' Convert the date to a string and write it to a file.
sw.WriteLine(dtIn.ToString("r", invC))
sw.Close()
' Restore the date and time data.
Dim sr As New StreamReader(".\DateData.dat")
Dim input As String = String.Empty
Do While sr.Peek() >= 0
input = sr.ReadLine()
Console.WriteLine("Stored data: {0}" , input)
Console.WriteLine()
' Parse the stored string.
Dim dtOut As DateTime = DateTime.Parse(input, invC, DateTimeStyles.RoundtripKind)
' Create a French (France) CultureInfo object.
Dim frFr As New CultureInfo("fr-FR")
' Displays the date formatted for the "fr-FR" culture.
Console.WriteLine("Date formatted for the {0} culture: {1}" ,
frFr.Name, dtOut.ToString("f", frFr))
' Creates a German (Germany) CultureInfo object.
Dim deDe As New CultureInfo("de-De")
' Displays the date formatted for the "de-DE" culture.
Console.WriteLine("Date formatted for {0} culture: {1}" ,
deDe.Name, dtOut.ToString("f", deDe))
Loop
sr.Close()
End Sub
End Module
' The example displays the following output:
' Stored data: Tue, 15 May 2012 16:34:16 GMT
'
' Date formatted for the fr-FR culture: mardi 15 mai 2012 16:34
' Date formatted for de-DE culture: Dienstag, 15. Mai 2012 16:34
安全决策
如果要根据字符串比较的结果或大小写更改做出安全决策(例如是否允许访问系统资源),则不应使用固定区域性。 相反,应通过调用包含 StringComparison 参数并作为参数提供 StringComparison.Ordinal 或作为参数的方法执行区分大小写或 StringComparison.OrdinalIgnoreCase 不区分大小写的序号比较。 执行区域性敏感字符串操作的代码在更改当前区域性或运行代码的计算机上的区域性与用于测试代码的区域性不同时,可能会导致安全漏洞。 相比之下,序号比较只取决于比较字符的二进制值。