比较2个参考字符串返回true

时间:2016-03-11 09:53:17

标签: c#

string a = "abc";
string b = "abc";
Console.WriteLine(String.ReferenceEquals(a, b));

ab是完全不同的引用,但是,我知道了。为什么是这样?在我将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

2 个答案:

答案 0 :(得分:1)

在编译步骤中,将汇总字符串文字,并且对特定值的所有引用都将相等。

来自specifications(粗体矿):

  

每个字符串文字不一定会产生新的字符串实例。当两个或多个根据字符串相等运算符(第7.9.7节)等效的字符串文字出现在同一个程序集中时,这些字符串文字引用相同的字符串实例

答案 1 :(得分:1)

  

ab是完全不同的引用。

不,他们不是。该字符串被实习。

'捕获'通常使用字符串==调用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