15

可能重复:
C# 中 == 运算符和 Equals() 方法之间的区别?

两种形式的平等,第一种失败,第二种成功。

(object)"abc" == (object)"abc"
false

((object)"abc").Equals((object)"abc")
true

在下面的参考资料中,我们看到“C# 中的等式运算符不是多态的”

ref: C# 中的字符串相等运算符 ==

顺便说一句:仍然不确定为什么这是一个问题。我以为可能是这样的,但这并不是因为这个测试成功了。

    static void Main(string[] args) {
        var o = new classOfT<string>() { val = "abc" };
        Console.WriteLine((object)o.val == "abc");
    }

    public class classOfT<T> {
        public string val { get; set; }
    }

顺便说一句:我不同意关于这个问题的完全相同的规则,但是,嘿。

答案指出:

... String 类包含一个静态 bool Equals(string a, string b) 方法和一个静态 bool Equals(object a, object b) 方法。不同之处在于前者是在 String 类本身中定义的,而后者是从 Object 类(它是 String 的基类)继承而来的

从语义上讲,这是有道理的,但在更广泛的 OO 和 C# 语言环境中是否有意义?

我为什么要纠结这个问题?好吧,刚刚发现了一个错误,我想在我的大脑中将其归档在押韵或理由下,而不是在“记住这个”下,它在类别之前被咬了。

更新:

目前正在考虑使用原语(从功能角度)与多态性。由于我一直在做越来越多的功能性东西,这可能就是为什么母语让我感到困惑。我还没有考虑完这个(不,我不务实。我被语言设计所吸引)。谢谢大家回复!

4

4 回答 4

3
(object)"abc" 

将从字符串对象创建一个对象引用。这样做

(object)"abc" == (object)"abc"

将创建两个不相等的对象引用。

但是,使用 equals 方法将检查存储的字符串的值是否相等。同样,这不是所有对象的默认实现,而是 String 对象的默认实现。对于任何自定义对象,您应该定义自己的 equals 方法的自定义实现来实现此行为。

于 2012-10-08T04:25:02.540 回答
2

代码示例返回 true。

(object)"abc" == (object)"abc"

我认为您提供的示例与应用程序中返回 false 的代码不同。CLR 使用字符串实习进行字符串优化。转换为 System.Object 将导致 == 运算符比较引用,并且由于字符串实习功能,== 运算符将导致 true。如果 == 运算符两边的参数将引用堆上的不同字符串对象,则比较只会返回 false。

检查程序集是否已标记[assembly: CompilationRelaxations(System.Runtime.CompilerServices.CompilationRelaxations.NoStringInterning)]属性。

于 2012-10-08T05:10:59.743 回答
1

字符串比较应该通过String.Compare,

http://blogs.msdn.com/b/abhinaba/archive/2005/10/28/486173.aspx

http://msdn.microsoft.com/en-US/vstudio/aa496123?pull=/library/en-us/dndotnet/html/StringsinNET20.asp

我不认为您“发现了错误”,因为 Microsoft 在 .NET BCL 中多次这样做,并且我们作为开发人员必须适应它变得很常见。一个简单的例子是,

var ip1 = IPAddress.Parse("127.0.0.1");
var ip2 = IPAddress.Parse("127.0.0.1");

你会发现ip1 != ip2,但是ip1.Equals(ip2) == true。推荐的比较方法是IPAddress.Compare(ip1, ip2). 无论如何,有时你必须记住一些事情。

于 2012-10-13T08:52:59.837 回答
0

== 运算符

对于预定义的值类型,相等运算符 (==) 如果其操作数的值相等则返回 true,否则返回 false。对于字符串以外的引用类型,== 如果它的两个操作数引用同一个对象,则返回 true。对于字符串类型,== 比较字符串的值。

等于

被字符串类覆盖,该类将“如果 obj 是一个字符串并且它的值与此实例相同,则返回 true;否则,返回 false。”

如果您的代码如下所示,

var s1= GetString1(); //some string object
var s2= GetString2(); //some string object containing same content as s1

(object)s1 == (object)s2
returns false - because == compares the references of the objects (which will be different if not interned)

((object)s1).Equals((object)s2)
returns true - because Equals will be called between actual strings at run time

但是,在当前形式中,您的代码

(object)"abc" == (object)"abc"
((object)"abc").Equals((object)"abc")

在这两种情况下都应该返回 true,因为默认情况下具有相同值的文字字符串会被实习,因此引用相同的对象(即引用也相等)

于 2012-10-08T05:34:02.130 回答