Equals()vs Static string.Equals()

时间:2016-03-25 14:29:46

标签: c#

在c#中读取字符串比较我发现了很多方法来比较2个字符串,看它们是否相等。

我习惯于来自c ++的==,但我了解到如果你将一个对象与一个字符串进行比较,那么==默认为引用值(或类似的东西)。

然后对于Equals()方法,我可以说我有2个字符串。

string s1 = null;
string s2 = "Hello";

如果我s1.Equals(s2);

我得到 null-reference异常导致第一个字符串为null

但如果我这样做

string.equals(s1,s2);

如果其中一个值为false,则只会返回null,如果两个值均为null,则会返回true,因为两个字符串都相等它们都是null

所以有任何理由不总是使用string.equals()方法。 另外一件事是,如果我在字符串中输入带有大写字母S的string.equals(),就像这个 S tring.equals()那么它仍然会像我小写一样运行但是IDE(visual studio 2015)会告诉我它可以简化,当我简化它时它会把它变成小写的。那是为什么?

2 个答案:

答案 0 :(得分:2)

根据MSDNstring.Equals方法

  

确定两个String对象是否具有相同的值。

这就是string.equals(s1,s2);在您的情况下总是返回false的原因,如果s1s2都为null或具有相同的值将返回true。

  

另外一件事是,如果我用a键入string.equals()   字符串中的大写字母S就像这个String.equals()那样它仍然会   运行相同,如果我有它的小写但IDE(视觉工作室   2015)会告诉我它可以简化,当我简化它   把它变成小写的。那是为什么?

string是C#原语,而System.String或简单String是相应的FCL(框架类库)类型。它与intInt32相同,其中int是C#原语,Int32是相应的FLC类型。

答案 1 :(得分:2)

两种方法都执行以下步骤:

  1. 检查两个字符串是否共享相同的引用(如果有,则返回true)。他们通过检查对象引用来执行此操作(通过检查(object)a==(object)b来执行此操作:两个==变量上的object运算符仅检查参考)。请注意,如果两个对象都是true,则此步骤也会返回null
  2. 检查是否null(如果有的话,请返回false
  3. 检查两个长度是否匹配(如果不是,则返回false
  4. 如果到了这一步,它会检查每个字节的字节并查看它们是否匹配(除非您在其中一个重载中指定了StringComparison的类型)(旁注:字节比较实现得相当即使管理不安全的代码也很好,但这是一个你不应该关心的实现细节。
  5. 您是否使用其中一个(如果您确定您的实例不是null)取决于您。两者基本上都是一样的,它们同样具有高性能。

    实施链接:instance Equals methodstatic string.Equals

    您无法在null个实例上调用实例方法,这就是它为您抛出NullReferenceException的原因...但是您的实例为{{1}的事实 可能 很重要(取决于您的规格),您可能需要在比较前检查null并采取相应措施(使用null将它隐藏起来,可能更容易出错)。如果它对您的规格不重要,那么使用其中一个只是一个设计决定。

    如果您感兴趣,两个字符串类型的运算符string.Equals实现为(source link):

    ==

    这样做public static bool operator == (String a, String b) { return String.Equals(a, b); } 与执行a == b

    相同

    对于string.Equals(a,b)String,前者为string(需要在顶部设置System.String,或指定整个using System;) ,后者是一个内置别名(顶部不需要System.String.Equals)。您可以使用其中任何一种,它们的行为完全相同