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