C#中字符串比较方法的差异

在C#中比较字符串非常简单。 实际上有几种方法可以做到这一点。 我在下面的部分列出了一些。 我很好奇的是它们之间的区别,以及什么时候应该用于其他方面? 应该不惜一切代价避免? 我还没有列出更多吗?

string testString = "Test";
string anotherString = "Another";

if (testString.CompareTo(anotherString) == 0) {}
if (testString.Equals(anotherString)) {}
if (testString == anotherString) {}

(注意:我在这个例子中寻找的是平等,不低于或大于,但也可以随意评论)


以下是这些功能如何工作的规则:

stringValue.CompareTo(otherStringValue)

  • null在字符串之前出现
  • 它使用CultureInfo.CurrentCulture.CompareInfo.Compare ,这意味着它将使用与文化相关的比较。 这可能意味着ß将与德国的SS相当或类似
  • stringValue.Equals(otherStringValue)

  • null不被视为等于任何东西
  • 除非您指定了一个StringComparison选项,否则它将使用看起来像是任何语言或文化中的直接序数相等检查,即ßSS不同
  • stringValue == otherStringValue

  • stringValue.Equals()不一样。
  • ==运算符调用静态Equals(string a, string b)方法(然后转到内部EqualsHelper进行比较。
  • null字符串调用.Equals()会得到null引用异常,而on ==不会。
  • Object.ReferenceEquals(stringValue, otherStringValue)

    只需检查引用是否相同,即它不仅仅是两个具有相同内容的字符串,而是将字符串对象与它自己进行比较。


    请注意,使用上述使用方法调用的选项,会有重载和更多选项来指定如何比较。

    我的建议是,如果你只是想检查平等,就决定是否要使用依赖于文化的比较,然后根据选择使用.CompareTo.Equals


    来自MSDN:

    “CompareTo方法主要用于排序或字母排序操作,当方法调用的主要目的是确定两个字符串是否相等时,不应使用CompareTo方法。要确定两个字符串是否相等,请调用Equals方法。 “

    他们建议在仅考虑平等时使用.Equals而不是.CompareTo 。 我不确定string类的.Equals==之间是否有区别。 我有时会使用.EqualsObject.ReferenceEquals代替==我自己的类,以防有人在以后的时间出现了,重新定义了==操作符为类。


    如果你对BCL方法的差异感到好奇,Reflector就是你的朋友:-)

    我遵循这些准则:

    完全匹配:编辑:我以前总是使用==运算符的原则,内部等于(字符串,字符串)对象==运算符用于比较对象引用,但它似乎strA.Equals(strB)仍然是1-11%整体比string.Equals(strA,strB),strA == strB和string.CompareOrdinal(strA,strB)更快。 我使用StopWatch对两个实际/非实例字符串值进行循环测试,具有相同/不同字符串长度以及不同大小(1B到5MB)。

    strA.Equals(strB)
    

    人类可读的匹配(西方文化,不区分大小写):

    string.Compare(strA, strB, StringComparison.OrdinalIgnoreCase) == 0
    

    人类可读的匹配(由CultureInfo定义的所有其他文化,不敏感案例/重音/假名/等):

    string.Compare(strA, strB, myCultureInfo) == 0
    

    用户可读的自定义规则匹配(所有其他文化):

    CompareOptions compareOptions = CompareOptions.IgnoreCase
                                  | CompareOptions.IgnoreWidth
                                  | CompareOptions.IgnoreNonSpace;
    string.Compare(strA, strB, CultureInfo.CurrentCulture, compareOptions) == 0
    
    链接地址: http://www.djcxy.com/p/58629.html

    上一篇: Differences in string compare methods in C#

    下一篇: PhpStorm object property type hint