我正在使用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
答案 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
。
CLR维护一个名为实习池的表,其中包含一个 单一,唯一引用到在程序运行时以编程方式声明或创建的每个文字字符串。
如果您想查看预期结果,请尝试以下代码段。它会在传递给构造函数时创建两个不同的实例。
试试这个:
String s1 = new String("asd".ToCharArray());
String s2 = new String("asd".ToCharArray());
Console.WriteLine("Reference Equals: {0}",Object.ReferenceEquals(s1, s2));//False