在C#中进行字符串比较时,执行
之间的区别是什么string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.CurrentCultureIgnoreCase);
和
string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.InvariantCultureIgnoreCase);
......无论如何,包含额外的参数是否很重要?
答案 0 :(得分:31)
其他帖子提供了很好的建议,但我认为展示一个确实有所作为的例子可能会很好:
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));
}
}
(毫无疑问,还有很多其他案例 - 这只是我想到的第一个案例。)
答案 1 :(得分:27)
Microsoft为何时使用InvariantCulture
属性提供了一些不错的指导:
MSDN: CultureInfo.InvariantCulture Property
......应用程序应该使用 不变的文化只适用于流程 这需要独立于文化 结果,例如格式化和 解析持久化的数据 文件。在其他情况下,它产生 结果可能是语言上的 不正确或文化不合适。
安全注意事项
如果做出安全决定 基于字符串的结果 比较或案例变更,你的 应用程序应使用序数 比较忽略了案例 使用InvariantCulture。 [...]
字符串操作
如果您的应用需要执行 文化敏感的字符串操作 不受价值影响 CurrentCulture,它应该使用一种方法 接受CultureInfo参数。 [...]
保留数据
InvariantCulture属性是 用于存储不会的数据 直接显示给用户。 将数据存储在独立于文化的环境中 format保证了一种已知的格式 不会改变。当用户来自 不同的文化访问数据,它 可以基于适当格式化 对特定用户。 [...]