在 C# 中进行字符串比较时,执行
string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.CurrentCultureIgnoreCase);
和
string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.InvariantCultureIgnoreCase);
...无论如何,包含那个额外的参数是否重要?
在 C# 中进行字符串比较时,执行
string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.CurrentCultureIgnoreCase);
和
string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.InvariantCultureIgnoreCase);
...无论如何,包含那个额外的参数是否重要?
其他帖子给出了很好的建议,但我认为展示一个肯定会有所作为的例子可能会很好:
using System;
using System.Globalization;
using System.Threading;
class Test
{
static void Main()
{
CultureInfo turkish = CultureInfo.CreateSpecificCulture("tr");
Thread.CurrentThread.CurrentCulture = turkish;
// In Turkey, "i" does odd things
string lower = "i";
string upper = "I";
// Prints False
Console.WriteLine(lower.Equals(upper,
StringComparison.CurrentCultureIgnoreCase));
// Prints True
Console.WriteLine(lower.Equals(upper,
StringComparison.InvariantCultureIgnoreCase));
}
}
(毫无疑问还有很多其他案例——这只是我想到的第一个案例。)
微软为何时使用该InvariantCulture
属性提供了一些体面的指导:
MSDN:CultureInfo.InvariantCulture 属性
...应用程序应仅将不变区域性用于需要与区域性无关的结果的过程,例如格式化和解析保存到文件的数据。在其他情况下,它产生的结果可能在语言上不正确或在文化上不合适。
安全注意事项
如果将根据字符串比较或大小写更改的结果做出安全决定,则您的应用程序应使用忽略大小写的序数比较,而不是使用 InvariantCulture。[...]
字符串操作
如果您的应用程序需要执行不受 CurrentCulture 值影响的区域性敏感字符串操作,则应使用接受 CultureInfo 参数的方法。[...]
持久化数据
InvariantCulture 属性对于存储不会直接向用户显示的数据很有用。以与区域性无关的格式存储数据可确保已知格式不会更改。当来自不同文化的用户访问数据时,可以根据特定用户进行适当的格式化。[...]