猿问

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

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

它们真的一样吗?今天,我遇到了这个问题。下面是直接窗口的转储:

?s 
"Category" ?tvi.Header "Category" ?s == tvi.Header false ?s.Equals(tvi.Header) true ?s == tvi.Header.ToString() true

所以,两个stvi.Header包含“类别”,但==返回假和Equals()返回真。

s定义为字符串,tvi.Header实际上是一个WPFTreeViewItem.Header..那么,他们为什么要返回不同的结果呢?我一直认为它们在C#中是可以互换的。

有人能解释一下为什么吗?


波斯汪
浏览 548回答 3
3回答

呼如林

问题中出现的明显矛盾是因为在一种情况下,Equals函数调用string对象,在另一种情况下,==上调用运算符。System.Object类型。string和object以不同的方式实现相等(分别为值和引用)。除此之外,任何类型都可以定义==和Equals不同的是,所以在一般情况下,它们是不可互换的。下面是一个使用double(取自Joseph Albahari对C#语言规范第7.9.2节的说明):double x = double.NaN;Console.WriteLine (x == x);         // FalseConsole.WriteLine (x != x);         // TrueConsole.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 ACUTEstring two = "Cafe\u0301";       // U+0301 COMBINING ACUTE ACCENTConsole.WriteLine(one == two);                                          // FalseConsole.WriteLine(one.Equals(two));                                     // FalseConsole.WriteLine(one.Equals(two, StringComparison.InvariantCulture));  // True本例中的两个字符串看起来是相同的(“Café”),因此如果使用天真(序数)相等,这可能很难调试。

繁星coding

C#有两个“相等”的概念:Equals和ReferenceEquals..对于大多数您将遇到的类,==运算符使用一种或另一种(或两者兼用),并且通常只对ReferenceEquals当处理引用类型时(但是string类是C#已经知道如何测试值相等的实例)。Equals比较值。(即使两个人分开int变量不存在于内存中的同一个位置,它们仍然可以包含相同的值。)ReferenceEquals比较引用并返回操作数是否指向内存中的同一对象。示例代码:var s1 = new StringBuilder("str");var s2 = new StringBuilder("str");StringBuilder sNull = null;s1.Equals(s2); // Trueobject.ReferenceEquals(s1, s2); // Falses1 == s2 // True - it calls Equals within operator overloads1 == sNull // Falseobject.ReferenceEquals(s1, sNull); // Falses1.Equals(sNull); // Nono!  Explode (Exception)
随时随地看视频慕课网APP
我要回答