日期:2014-05-17  浏览次数:20687 次

请高手指导下关于用==判断string相等的问题
用==比较两个object变量中的string到底是不是安全的?
我记得有人说相同的字符串是同一地址,那就算调用了object.ReferenceEquals也应该返回true才对吧?

最可气的是,监视窗口里最后两行的值竟然不一样。。。为什么呢。。

------解决方案--------------------
o是object对象
"0"是字符串
不能这样比较,你改成
if("0"==o.ToString())

------解决方案--------------------
ls都已回答,你比较的是object,此时调用的是object的=方法
------解决方案--------------------
另外关于“有人说相同的字符串是同一地址”,不完全正确,对于新创建的两个相同内容的字符串,它们的地址是不同的,而如果对字符串进行赋值操作,由于传递的是引用地址,所以它们的地址才会相同。你应该把字符串理解为只读的引用对象,除非要修改它,否则都是传递引用地址。修改或初始化字符串,则创建新的。
------解决方案--------------------
object类型没有重载op_Equality,==直接比较引用。两个具有相同“值”的字符串变量一定引用同一个对象吗?两个具有相同“值”的字符串对象一定是同一个对象吗?当然不是,.NET是有字符串暂存这个特性,但它绝对不是“具有相同值的字符串对象总是同一个”。

你给的例子通常应该是会被暂存的,我这里无论是监视窗口还是编译后运行二者都是同一个对象。

至于Object.Equals,这是个虚函数,没什么好说的,和声明时类型无关。