请看下面的代码:
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.
编辑:关于 ==
行为的快速说明:
- 如果两个操作数的编译时类型都是
==
,将使用string
提供的重载,执行内容比较 - 否则,将使用仅比较引用是否相等的“默认”实现,如您在问题中所述。
在您的例子中,操作数的编译时类型都是object
,因此它真正使用了引用相等性。
关于c# - "stringDemo"与新字符串("stringDemo".ToCharArray);,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16355952/