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

StackOverflow https://stackoverflow.com/questions/417954

  •  03-07-2019
  •  | 
  •  

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

之间的区别是什么
string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.CurrentCultureIgnoreCase);

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

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

有帮助吗?

解决方案

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

MSDN:CultureInfo.InvariantCulture Property

  

......应用程序应该使用   不变的文化只适用于流程   这需要独立于文化   结果,例如格式化和   解析持久化的数据   文件。在其他情况下,它产生   结果可能是语言上的   不正确或文化不合适。

     

安全注意事项

     

如果做出安全决定   基于字符串的结果   比较或案例变更,你的   应用程序应使用序数   比较忽略了案例   使用InvariantCulture。 [...]

     

字符串操作

     

如果您的应用需要执行   文化敏感的字符串操作   不受价值影响   CurrentCulture,它应该使用一种方法   接受CultureInfo参数。   [...]

     

保留数据

     

InvariantCulture属性是   用于存储不会的数据   直接显示给用户。   将数据存储在独立于文化的环境中   format保证了一种已知的格式   不会改变。当用户来自   不同的文化访问数据,它   可以基于适当格式化   对特定用户。 [...]

其他提示

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top