为什么.net中的字符串默认情况下是敏感的?

时间:2010-12-13 23:47:07

标签: .net string case-sensitive case-insensitive

大多数时候我想进行字符串比较,我希望它们不区分大小写。

那么为什么.net中的字符串默认情况下是敏感的?

编辑1:要明确我认为以下默认情况下应该返回true。或者至少允许我有一个编译时标志来实现它。

"John Smith" == "JOHN SMITH" 

编辑2:我可以想到更多应该不区分大小写的事情的例子

应该不区分大小写的事情示例

  • 用户名
  • 网址
  • 文件扩展名/文件名/目录名称/路径
  • 计算机/服务器名称
  • 州/国家/地点等
  • FirstName / LastName / Initials
  • 的GUID
  • 月/日名称

应该区分大小写的事情示例

  • 密码

8 个答案:

答案 0 :(得分:4)

很抱歉这个简单的答案,但这就是它的方式:)

在基本级别,字符串表示为字符列表,其中“a”与“A”不同,因此它可能是最简单的表示\约定。在你的情况下,可以公平地说,大多数比较都是不区分大小写的,但我认为论证的另一面至少同样适用,并且采用了一个约定。

我想要使用一些辅助方法\类可以减轻你的痛苦。

答案 1 :(得分:2)

因为存在不同类型的不敏感匹配,并且不清楚您想要哪一种。以下是三种最常见的模式:

StringComparison.OrdinalIgnoreCase
StringComparison.InvariantCultureIgnoreCase
StringComparison.CurrentCultureIgnoreCase

他们有很多不同的用例。您可能没有注意到这一点,因为您每天都在处理ASCII。其他地区的用户会看到更多差异。

答案 2 :(得分:1)

因为不区分大小写不具备性能,并且因为即使您不打算也不行。

供应商需要根据性能进行竞争,因此默认选项往往是性能最佳的选项。最好的情况是,不区分大小写需要在比较之前将两个字符串折叠到一个常见的情况。在最坏的情况下,根据区域设置,它需要一个可以是两倍长的代码路径。如果供应商违反了性能较低的版本,竞争对手会选择最差情况进行基准测试。

由于区分大小写在某些搜索中失败,因此您必须在代码中解决此问题。它迫使有意识的决定。相反,即使在您不希望的情况下,不区分大小写也会起作用。而不是强迫你做出决定,而是创造一个你可以忽视它而不利于你的方案。作为选择架构的问题,供应商倾向于选择导致更少缺陷的选项 - 在这种情况下是区分大小写。

答案 3 :(得分:1)

<。> .Net中的字符串比较区分大小写,因为字符串(和单个字符)本质上区分大小写。

字符“a”在内部存储有不同的ASCII或Unicode值作为“A”。说“a”与“A”相同并不“正确”。

当使用除英语之外的语言,使用哈希表等算法或使用许多加密/解密算法时,这种区别变得至关重要。

我的两分钱:区分大小写的比较是默认值,因为它是正确的。

答案 4 :(得分:0)

在VB.NET中,可以将“选项比较”设置为文本,以便不区分大小写,但我强烈反对它。我最喜欢的是当我需要不敏感地比较并阅读文本的小写版本时使用string.toLower()方法。

为什么呢?因为如果区分大小写在某些应用程序中的重要性,您还会比较其他什么呢?

答案 5 :(得分:0)

您无法更改现有类的行为。 mscorelib / system.core中定义的System.String类覆盖==并定义了一个区分大小写的等式。

您所能做的就是为字符串添加扩展方法并实现不区分大小写:

public static class StringEqualityExtension
{
    public static bool StringEquals(this string value, string other)
    {
       return value.ToLower()==other.ToLower();
    } 
}

// usage
string myString = "Some112";
string other = "sOME112";

bool equal = myString.StringEquals(myString);

答案 6 :(得分:0)

你的情况不一定是最常见的情况,一个非常常见的情况是将文档中的单词与语法条件相匹配,在这种情况下,区分大小写是绝对必须的。

注意在敏感方式的情况下匹配非常简单。实际上,字符串的equals方法具有专门用于指定如何比较的重载。

答案 7 :(得分:0)

我知道这是necroposting,但是

我来到这里寻找解决同样问题的方法。现在差不多5年了......但我不介意,因为这是最早的搜索结果之一,我认为最好包含正确的信息。

根据this MSDN page,您只需要在文件中添加一行代码:

Option Compare Text

如果将上面的行添加到核心的开头,则告诉CLR从默认(Option Compare Binary)切换到不区分大小写的比较。

我不知道这是否适用于C#。