"stringDemo"与新字符串("stringDemo".ToCharArray);

Mas*_*ian 9 .net c# oop c#-4.0

请看下面的代码:

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是:
False
True

现在考虑这个:

using System;
class MyClass
{
    static void Main()
    {
        object o = ".NET Framework";
        object o1 = ".NET Framework";
        Console.WriteLine(o == o1);
        Console.WriteLine(o.Equals(o1));
    }
}
Run Code Online (Sandbox Code Playgroud)

其结果是:


"=="比较对象引用是否相同,而".Equals()"比较内容是否相同.我想知道这些代码之间有什么不同?!

object o1 = new string(".NET Framework".ToCharArray());
Run Code Online (Sandbox Code Playgroud)

object o1 = ".NET Framework"; 
Run Code Online (Sandbox Code Playgroud)

他们两个都是一个对象,但为什么结果不同?

Jon*_*eet 15

他们两个都是一个对象,但为什么结果不同?

在第二种情况下,您为oo1赋值使用相同的字符串常量.C#保证同一程序中任何两个相等的字符串常量表达式将引用相同的字符串对象.因此,值oo1是相同的.

虽然我找不到更通用的形式(对于常量字符串表达式),但您的情况实际上涵盖了C#规范的2.4.4部分:

当根据字符串相等运算符等效的两个或多个字符串文字出现在同一程序中时,这些字符串文字引用相同的字符串实例.

编辑:关于行为的快速说明==:

  • 如果两个操作数都具有编译时类型==,string则将使用提供的重载,执行内容比较
  • 否则,正如您在问题中所述,将使用仅仅比较引用的"默认"实现.

在您的情况下,操作数的编译时类型都是object,因此它真正使用引用相等.