string对象比较问题求解

晓峰随风 2013-08-03 04:18:23
代码:
string a = "hello";
string b = "h";
string c = "hello";
string d = a;
b += "ello";

Console.WriteLine(a == b);
Console.WriteLine((object)a == (object)b);
Console.WriteLine((object)a == (object)c);
Console.WriteLine((object)a == (object)d);
运行:
true
false
true
true

问题: 前两个还好理解,对象生成之后就不再改变。后两个怎么就一样了呢?
...全文
159 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
晓峰随风 2013-08-03
  • 打赏
  • 举报
回复
引用 2 楼 a549013598 的回复:
因为对b进行操作的时候,也就是 b += "ello"; CLR会开辟一个新的string变量,而实际的b的值还是 "h".并没有改变。只是新的值变量。如果不错的话,在做 b += "ello"; 操作的时候,b得到了一个新的内存地址。
反汇编看了下,还是同一个地址。
  • 打赏
  • 举报
回复
因为CLR的字符串留用(string interning)机制导致后面两个相等。只在内存中保留字符串的一个实例,需要引用字符串的所有变量只需指向单独一个字符串对象。
  • 打赏
  • 举报
回复
不要胡思乱想,你应该切实地看看 string 类型的 Equals 方法是如何实现的。
aaabc 2013-08-03
  • 打赏
  • 举报
回复
后面两个位true是因为他们指向的地址都是一致的,也就是说,是同一个实例
aaabc 2013-08-03
  • 打赏
  • 举报
回复
因为对b进行操作的时候,也就是 b += "ello"; CLR会开辟一个新的string变量,而实际的b的值还是 "h".并没有改变。只是新的值变量。如果不错的话,在做 b += "ello"; 操作的时候,b得到了一个新的内存地址。
newtee 2013-08-03
  • 打赏
  • 举报
回复
我以为都是true呢 关注一下

110,526

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧