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é”),因此如果使用天真(序数)相等,这可能很难调试。
TA贡献1797条经验 获得超4个赞
Equals
ReferenceEquals
==
ReferenceEquals
string
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)
- 3 回答
- 0 关注
- 547 浏览
添加回答
举报