请看下面的代码:
using System; class MyClass { static void Main() { object o = ".NET Framework"; object o1 = new string(".NET Framework".tocharArray()); Console.WriteLine(o == o1); Console.WriteLine(o.Equals(o1)); } }
其结果是:
假
真正
现在考虑一下:
using System; class MyClass { static void Main() { object o = ".NET Framework"; object o1 = ".NET Framework"; Console.WriteLine(o == o1); Console.WriteLine(o.Equals(o1)); } }
其结果是:
真正
真正
如果对象引用相同,则“==”比较,如果内容相同,则“.Equals()”将进行比较.我想知道这些代码有什么区别?
object o1 = new string(".NET Framework".tocharArray());
和
object o1 = ".NET Framework";
他们都是一个对象,但是为什么结果会有所不同呢?
解决方法
both of them turn out an object but why results are different?
在第二种情况下,您正在为o和o1赋值使用相同的字符串常量. C#保证同一程序中的任何两个相等的字符串常量表达式将引用相同的字符串对象.所以o和o1的值是相同的参考.
虽然我找不到更一般的形式(对于常量字符串表达式),您的情况实际上涵盖在C#规范的2.4.4节:
When two or more string literals that are equivalent according to the string equality operator appear in the same program,these string literals refere to the same string instance.
编辑:关于==的行为的快速注释:
>如果两个操作数的编译时类型为==,将使用由字符串提供的重载,执行内容比较
>否则,正如您在问题中所述,将使用刚刚比较参考的“默认”实现.
在你的情况下,编译时类型的操作数都是对象,所以它真正地使用引用相等.