C# 比较2个引用字符串返回true

C# 比较2个引用字符串返回true,c#,C#,a和b显然是不同的参考,但我明白了。为什么会这样?我在某个地方读到过,当你将abc赋值给b时,编译器看到堆中已经有了确切的abc值,并指向与a相同的内存地址,但如果是这样,那么根据这个逻辑,下面代码的最后一行应该打印true: string a = "abc"; string b = "abc"; Console.WriteLine(String.ReferenceEquals(a, b)); 在编译步骤中,字符串文字将被合并,并且对特定值的所有引用都将相等 从(我的黑体字): 每个字符串文本

a
b
显然是不同的参考,但我明白了。为什么会这样?我在某个地方读到过,当你将
abc
赋值给
b
时,编译器看到堆中已经有了确切的
abc
值,并指向与
a
相同的内存地址,但如果是这样,那么根据这个逻辑,下面代码的最后一行应该打印
true

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

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

从(我的黑体字):

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

a
b
显然是不同的参考

不,他们不是。那根绳子被拘留了

通常,字符串的“catch”是
==
调用
string.Equals
方法,该方法不仅比较引用,而且还比较引用

证明:

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

string
的实例被实习。
SomeClass
的实例不是。你看到了吗&/or?很好的解释,加上你的注释
//true:引用相同的
你不是说行比较引用了吗?是的。字符串比较首先基于引用,而不是字符串比较
a
b
共享相同的引用,因为字符串已被插入。Oh不知道:)
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