为了账号安全,请及时绑定邮箱和手机立即绑定

字符串.equals()和=操作符真的相同吗?

字符串.equals()和=操作符真的相同吗?

C#
波斯汪 2019-07-08 16:40:20
字符串.equals()和=操作符真的相同吗?它们真的一样吗?今天,我遇到了这个问题。下面是直接窗口的转储:?s  "Category" ?tvi.Header "Category" ?s == tvi.Header false ?s.Equals(tvi.Header) true ?s == tvi.Header.ToString() true所以,两个s和tvi.Header包含“类别”,但==返回假和Equals()返回真。s定义为字符串,tvi.Header实际上是一个WPFTreeViewItem.Header..那么,他们为什么要返回不同的结果呢?我一直认为它们在C#中是可以互换的。有人能解释一下为什么吗?
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

问题中出现的明显矛盾是因为在一种情况下,Equals函数调用string对象,在另一种情况下,==上调用运算符。System.Object类型。string和object以不同的方式实现相等(分别为值和引用)。


除此之外,任何类型都可以定义==和Equals不同的是,所以在一般情况下,它们是不可互换的。


下面是一个使用double(取自Joseph Albahari对C#语言规范第7.9.2节的说明):


double x = double.NaN;

Console.WriteLine (x == x);         // False

Console.WriteLine (x != x);         // True

Console.WriteLine (x.Equals(x));    // True

他接着说double.Equals(double)方法设计为正确处理列表和字典。这个==另一方面,操作符的设计遵循IEEE 754浮点类型标准。


在确定字符串相等的特定情况下,行业首选项是使用==也不string.Equals(string)大部分时间。这些方法决定两个字符串是否是相同的字符对字符,这很少是正确的行为。用它更好string.Equals(string, StringComparison),它允许您指定特定类型的比较。通过使用正确的比较,您可以避免许多潜在的(很难诊断的)错误。


以下是一个例子:


string one = "Caf\u00e9";        // U+00E9 LATIN SMALL LETTER E WITH ACUTE

string two = "Cafe\u0301";       // U+0301 COMBINING ACUTE ACCENT

Console.WriteLine(one == two);                                          // False

Console.WriteLine(one.Equals(two));                                     // False

Console.WriteLine(one.Equals(two, StringComparison.InvariantCulture));  // True

本例中的两个字符串看起来是相同的(“Café”),因此如果使用天真(序数)相等,这可能很难调试。


查看完整回答
反对 回复 2019-07-08
?
繁星coding

TA贡献1797条经验 获得超4个赞

C#有两个“相等”的概念:EqualsReferenceEquals..对于大多数您将遇到的类,==运算符使用一种或另一种(或两者兼用),并且通常只对ReferenceEquals当处理引用类型时(但是string类是C#已经知道如何测试值相等的实例)。

  • Equals

    比较值。(即使两个人分开

    int

    变量不存在于内存中的同一个位置,它们仍然可以包含相同的值。)
  • ReferenceEquals

    比较引用并返回操作数是否指向内存中的同一对象。

示例代码:

var s1 = new StringBuilder("str");

var s2 = new StringBuilder("str");

StringBuilder sNull = null;


s1.Equals(s2); // True

object.ReferenceEquals(s1, s2); // False

s1 == s2 // True - it calls Equals within operator overload

s1 == sNull // False

object.ReferenceEquals(s1, sNull); // False

s1.Equals(sNull); // Nono!  Explode (Exception)


查看完整回答
反对 回复 2019-07-08
  • 3 回答
  • 0 关注
  • 547 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信