C# &引用;stringDemo“;与新字符串(“stringDemo”.ToCharArray)的比较;

C# &引用;stringDemo“;与新字符串(“stringDemo”.ToCharArray)的比较;,c#,.net,oop,c#-4.0,C#,.net,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));

请查看以下代码:

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));
    }
}
结果是:
正确
正确

“==”比较对象引用是否相同,“==”比较内容是否相同。我想知道这些代码之间有什么不同

object o1 = new string(".NET Framework".ToCharArray());

它们都是一个物体,但为什么结果不同呢

它们都是一个物体,但为什么结果不同呢

在第二种情况下,对
o
o1
赋值使用相同的字符串常量。C#保证同一程序中的任意两个相等的字符串常量表达式将引用同一个字符串对象。因此
o
o1
的值是相同的参考值

虽然我找不到更一般的形式(对于常量字符串表达式),但您的情况实际上已在C#spec:

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

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

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

在您的例子中,操作数的编译时类型都是
对象
,因此它真正使用的是引用相等。

您的第二个示例使用string from,这就是为什么它们的引用也是相等的,而在您的第一个代码示例中,您有两个不同的string对象。考虑下面的例子。
object o = ".NET Framework";
object o1 = ".NET Framework";
object o2 = new string(".NET Framework".ToCharArray());
Console.WriteLine(o == o1);
Console.WriteLine(o.Equals(o1));
Console.WriteLine(Object.ReferenceEquals(o,o1)); //True
Console.WriteLine(Object.ReferenceEquals(o, o2)); //False
编辑:

从其他帖子上的评论中,我想我应该提到,
=
关于
string
的当前行为与其他引用类型不同:

对于字符串以外的引用类型,==如果其两个 操作数引用同一对象对于字符串类型,==比较 字符串的值

因此,以下情况将导致
为true

string o = ".NET Framework";
string o2 = new string(".NET Framework".ToCharArray());
Console.WriteLine(o == o1); //True

因为现在类型是
string
,而不是
object
,所以您可能会感到困惑,因为use使用的是类型
object
,而不是
string

如果通过操作符比较两个
对象
,则仅比较对这些对象的引用。由于同一程序集中的两个常量字符串合并为一个,因此它们具有相同的引用

如果要通过操作比较两个
字符串
,则使用其他方法。字符串具有对
=
的运算符重写。请参阅:。此替代不会比较参照,而是比较两个对象的值。在您的示例中,编译器现在无法将两种类型都设置为
string
类型,因为您使用的是
对象
。这就是为什么
string操作==
不用于比较
o
o1

返回
Equals
函数
Equals
是一个可以通过继承类来重写的函数。在本例中,
string
类已重写它,并用自己的比较方法替换它。其中,
object.Equals
仅比较引用,
string.Equals
比较值

编辑

所以。。。这将产生您的“奇怪”值:

这将产生预期值:

    string o = ".NET Framework";
    string o1 = new string(".NET Framework".ToCharArray());
    Console.WriteLine(o == o1); // Will prodcuce: True.
    Console.WriteLine(o.Equals(o1)); // Will prodcuce: True.

我猜你会在答案中听到字符串
实习
,而且字符串是不可变的。重复的。请先尝试搜索。@CodeCaster:不一样。。。这是关于对象中的字符串,然后比较它们。@Martin这与字符串的内部处理有关,无论是否将它们作为对象装箱。答案在我链接的问题的答案中。为了与其他文章进行比较,这个问题的标题可能是:object.Equals()和==运算符是否真的相同。当我们使用字符串数据类型时,它总是进行内容比较。我们可以使用“.Equals()”或“==”进行内容比较。@Mesut,但您没有为
o
o1
使用类型
string
。您正在使用类型
object
。这是否意味着
string
类型不会覆盖
Equals(object)
方法?在字典里当钥匙不是很危险吗<代码>字符串
会覆盖
等于(对象)
。这就是为什么您会看到值比较的结果,而不是参考比较的结果。如果
string
没有覆盖
Equals
方法,则只会比较引用,结果为false。@MartinMulder-Oh-man。早上对我来说太早了。完全颠倒了测试结果。认为
=
报告的是真的,而
报告的是假的,所有人都疯了。无视我:)这真的回答了他的问题吗?因为他的问题不仅是关于
等于
=
的问题,而且是关于
对象与
字符串的问题。
字符串的问题。@MartinMulder:我想是的,因为OP已经意识到
“==”比较对象引用是否相同(在他的例子中)。不过我会说得更清楚。
    object o = ".NET Framework";
    object o1 = new string(".NET Framework".ToCharArray());
    Console.WriteLine(o == o1); // Will prodcuce: False.
    Console.WriteLine(o.Equals(o1)); // Will prodcuce: True.
    string o = ".NET Framework";
    string o1 = new string(".NET Framework".ToCharArray());
    Console.WriteLine(o == o1); // Will prodcuce: True.
    Console.WriteLine(o.Equals(o1)); // Will prodcuce: True.