string a = "abc";
string b = "abc";
Console.WriteLine(String.ReferenceEquals(a, b));
a
和b
是完全不同的引用,但是,我知道了。为什么是这样?在我将abc
分配给b
的某个地方,编译器发现堆中已经存在确切的abc
值并且指向相同的内存地址为a
,但如果是这种情况,则按照该逻辑,下面此代码的最后一行应打印true
:
class SomeClass
{
public int _num;
public SomeClass(int num)
{
_num = num;
}
}
var a = new SomeClass(3);
var b = new SomeClass(3);
Console.WriteLine(Object.ReferenceEquals(a, b)); // prints false
答案 0 :(得分:1)
在编译步骤中,将汇总字符串文字,并且对特定值的所有引用都将相等。
来自specifications(粗体矿):
每个字符串文字不一定会产生新的字符串实例。当两个或多个根据字符串相等运算符(第7.9.7节)等效的字符串文字出现在同一个程序集中时,这些字符串文字引用相同的字符串实例。
答案 1 :(得分:1)
a
和b
是完全不同的引用。
不,他们不是。该字符串被实习。
'捕获'通常使用字符串==
调用string.Equals
方法,该方法不仅会比较引用,还会also the actual representation of the string。
证明:
string a = "a";
string b = "a"; // intering
string c = new string(a.ToCharArray()); // no interning
bool r;
r = a == b; // true: references the same
r = a == c; // true: references different, match string value
r = (object)a == (object)b; // true: references the same
r = (object)a == (object)c; // false: references different