请看下面的代码:

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";

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

最佳答案



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

尽管我找不到更通用的形式(用于常量字符串表达式),但您的情况实际上已被C#规范的2.4.4节覆盖:



编辑:关于==的行为的简要说明:

  • 如果两个操作数的编译时类型均为==,则将使用string提供的重载,执行内容比较
  • 否则,如您在问题中所述,将使用仅比较引用是否相等的“默认”实现。

  • 在您的情况下,操作数的编译时类型均为object,因此它实际上是在使用引用相等性。

    关于c# - "stringDemo"与新字符串("stringDemo".ToCharArray);,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16355952/

    10-10 11:28
    查看更多