Object.ReferenceEquals为匹配的字符串返回true

时间:2014-03-10 01:20:36

标签: c# string mono

我正在使用Mono,在比较两个字符串的引用时遇到了一个有趣的结果。下面的代码演示了一个示例:

using System;

class Program
{
    static void Main()
    {
        String s1 = "asd";
        String s2 = "asd";
        Console.WriteLine("Reference Equals: {0}", Object.ReferenceEquals(s1, s2));

        Console.ReadLine();
    }
}

收益为真

有趣的是,两个字符串具有相同的值,但显然它们指的是两个不同的实例。发生了什么事?

mono --version:Mono JIT编译器版本3.2.6 OS X 10.9.2

2 个答案:

答案 0 :(得分:3)

http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

  

公共语言运行库通过维护a来保存字符串存储   表,称为实习池,包含单个引用   以编程方式声明或创建的每个唯一文字字符串   你的计划。因此,带有一个文字字符串的实例   特殊值仅在系统中存在一次。

下面显示了不是从string literal创建字符串时的行为。

    static void Main(string[] args)
    {
        var string1 = new string(new []{'c'});
        var string2 = new string(new []{'c'});
        Console.WriteLine(string1.Equals(string2));                 //true
        Console.WriteLine(Object.ReferenceEquals(string1,string2)); //false
    }

答案 1 :(得分:1)

  

有趣的是,两个字符串具有相同的值,但显然它们   参考两个不同的实例

不,他们没有提及两个不同的实例,实际上没有两个不同的实例 只有一个实例在您提供时相同的字符串文字。

在您的计划中针对所有类似string constants的{​​{1}}而创建了instance,并且所有字符串reference variables都引用相同的instance,因此当您运行ReferenceEquals()references的方法,你会得到True a他们在逻辑上指的是同一个instance

来自:String Interning

  

CLR维护一个名为实习池的表,其中包含一个   单一,唯一引用到在程序运行时以编程方式声明或创建的每个文字字符串。

如果您想查看预期结果,请尝试以下代码段。它会在传递给构造函数时创建两个不同的实例。

试试这个:

String s1 = new String("asd".ToCharArray());
String s2 = new String("asd".ToCharArray());
Console.WriteLine("Reference Equals: {0}",Object.ReferenceEquals(s1, s2));//False