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

标签 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 = ".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?

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

虽然我找不到更通用的形式(对于常量字符串表达式),但您的情况实际上包含在 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/

相关文章:

java - 使用 OOP 实现我的点和线类 - 错误 : null pointer exception

c# - 如何计算已知字体大小和字符的 WPF TextBlock 宽度?

javascript - 如何在以ajax方式插入后刷新我的服务器控件?

c# - 使用 C# 从 DataTable 创建 HTML

c# - 如何在一行代码中转换和使用一个对象?

c# - 不确定何时在 C# 中使用 'base'

c# - 为什么 IList<T> 不只从 ICollection<T> 继承?

c# - 如何使用c#将文本显示为隐藏

c# - 通用工厂方法创建通用类型的来龙去脉

c# - 在c#中向多维数组添加维度