39

在 C# 中进行字符串比较时,执行

string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.CurrentCultureIgnoreCase);

string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.InvariantCultureIgnoreCase);

...无论如何,包含那个额外的参数是否重要?

4

2 回答 2

37

其他帖子给出了很好的建议,但我认为展示一个肯定会有所作为的例子可能会很好:

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));
    }
}

(毫无疑问还有很多其他案例——这只是我想到的第一个案例。)

于 2009-01-06T20:50:38.730 回答
29

微软为何时使用该InvariantCulture属性提供了一些体面的指导:

MSDN:CultureInfo.InvariantCulture 属性

...应用程序应仅将不变区域性用于需要与区域性无关的结果的过程,例如格式化和解析保存到文件的数据。在其他情况下,它产生的结果可能在语言上不正确或在文化上不合适。

安全注意事项

如果将根据字符串比较或大小写更改的结果做出安全决定,则您的应用程序应使用忽略大小写的序数比较,而不是使用 InvariantCulture。[...]

字符串操作

如果您的应用程序需要执行不受 CurrentCulture 值影响的区域性敏感字符串操作,则应使用接受 CultureInfo 参数的方法。[...]

持久化数据

InvariantCulture 属性对于存储不会直接向用户显示的数据很有用。以与区域性无关的格式存储数据可确保已知格式不会更改。当来自不同文化的用户访问数据时,可以根据特定用户进行适当的格式化。[...]

于 2009-01-06T20:27:24.923 回答