【问题标题】:Difference between String1.Equals(string2) and string1==string2 C# [duplicate]String1.Equals(string2) 和 string1==string2 C# [重复] 之间的区别
【发布时间】:2011-11-11 17:48:37
【问题描述】:

可能重复:
C#: String.Equals vs. ==
Are string.Equals() and == operator really same?

有时在两个字符串之间的情况下,我会写:

if(string1==string2) //Do something

有时我会写:

if(string1.Equals(string2)) //Do something

问题有时是第一个不工作,或者错误工作,这两个表达有什么区别吗?

【问题讨论】:

  • 如果string1 为空,则NullReferenceException 将出现在第二个中。
  • 第一版代码什么时候不能用?你能提供示例操作数吗?
  • 抱歉,我发布问题时没有提出该建议。

标签: c# .net string if-statement


【解决方案1】:

只要两个操作数的编译时类型都是string,第一个总是有效的。

如果任一操作数的编译时类型不是string,它将使用正常的引用标识比较,而不是比较字符串是否相等。基本上你想调用==(string, string) 重载而不是普通的==(object, object) 重载。

请注意,即使string1 为空,第一个也会成功,而在这种情况下,第二个会抛出NullReferenceException。为了保留Equals 调用但避免此问题的另一种方法是调用static object.Equals(object, object) method

if (object.Equals(string1, string2))

我个人只是在编译时类型合适的情况下使用==

【讨论】:

  • String.Equals() 也有一个 StringComparison 的重载,它可以让您更好地控制您希望如何比较字符串。我想还是有一点需要注意。
  • @MikeChristensen:哦,当然,如果您正在寻找其他重载 - 我只是在谈论给出的代码,以及静态方法使用的等效比较。
  • object.== 可以在您提到的场景以外的场景中调用,例如如果变量之一被键入为IEnumerable<char>
  • @Ani:好的,将编辑 - 基本上是“如果操作数都不是字符串类型”。
【解决方案2】:

在两种字符串类型上使用== 将执行引用身份检查,这意味着只有当两个引用都指向同一个对象时才会返回true。另一方面,Equals 预计会执行值比较,如果引用指向等效的对象,则会返回 true。

【讨论】:

  • 它可以产生巨大的差异——这就是编译时类型很重要的原因。如果您使用==(string, string) 的重载,那么执行值相等比较,不是引用身份检查。目前尚不清楚您所说的“简单类型”是什么意思,但我怀疑您对 string 类型有误解。完全有可能拥有两个相同但不同的 string 实例,如果您使用 ==(object, object) 重载,则 返回 false。
  • 我认为这并不完全正确。 "cat" == "cat" 将返回 true,即使它们不是同一个对象。真正的区别是== 会调用静态的String 方法,而myStr.Equals() 会调用实例方法(这就是为什么实例为空时会失败。
  • @MikeChristensen:这不是一个很好的例子,因为在这种情况下,文字实习意味着您正在比较相同参考的两个副本。
  • @JonSkeet:有时很难考虑所有可能的警告。我觉得现在的措辞好一点。如果上述任何内容不正确或我遗漏了什么,您能告诉我吗?
  • @JamesJohnson:您所说的“string type 上的== 的标准使用”的意思完全不清楚。如果xystring 变量,那么x == y 将执行与Equals 相同的测试。
猜你喜欢
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多