C#字符串比较:CurrentCultureIgnoreCase和InvariantCultureIgnoreCase之间的差异

Dan*_*rza 33 c# string comparison

在C#中进行字符串比较时,执行a之间的区别是什么

string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.CurrentCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.InvariantCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 32

其他帖子提供了很好的建议,但我认为展示一个确实有所作为的例子可能会很好:

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";

        Console.WriteLine(lower.Equals(upper, 
            StringComparison.CurrentCultureIgnoreCase));
        Console.WriteLine(lower.Equals(upper, 
            StringComparison.InvariantCultureIgnoreCase));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,土耳其人是一个特例.它们有一个带有大写"I"的小写无点"ı"和带有大写"İ"的小写"i".它被认为是文化差异的典型案例. (6认同)
  • 有关土耳其语作为配置程序提到的"规范案例"的更多信息,请参阅:http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html (3认同)

Mic*_*urr 27

Microsoft为何时使用该InvariantCulture属性提供了一些不错的指导:

MSDN:CultureInfo.InvariantCulture属性

...应用程序应该仅对需要与文化无关的结果的进程使用不变文化,例如格式化和解析持久保存到文件的数据.在其他情况下,它会产生可能在语言上不正确或在文化上不合适的结果.

安全考虑因素

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

字符串操作

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

坚持数据

InvariantCulture属性对于存储不会直接显示给用户的数据非常有用.以独立于文化的格式存储数据可确保不会发生变化的已知格式.当来自不同文化的用户访问数据时,可以根据特定用户对其进行适当格式化.[...]