用==比较两个object变量中的string到底是不是安全的?
我记得有人说相同的字符串是同一地址,那就算调用了object.ReferenceEquals也应该返回true才对吧?最可气的是,监视窗口里最后两行的值竟然不一样为什么呢。。
我记得有人说相同的字符串是同一地址,那就算调用了object.ReferenceEquals也应该返回true才对吧?最可气的是,监视窗口里最后两行的值竟然不一样为什么呢。。
"0"是字符串
不能这样比较,你改成
if("0"==o.ToString())
Object的Equals方法在调用时,会自动调用派生类的Equals方法,String继承Object,因此即使将String转换为了Object也无所谓,最终执行的是String的Equals,得到正确的结果。
object o1 = "0"; var b = (object)"0" == (object)"0";
var b1 = object.Equals("0", "0");
var b2 = object.ReferenceEquals("0", "0");
var b3 = o == "0";上面4个值都是true,可在调试窗口,只有b1是true,理解为调试器的bug吧。你可以把这个提交给微软。
只要object 是string ,用 == 或者 equal 都会调用继承类(string)的比较方法,所以一样的;不过为了可读性,我习惯用后面的方法。
{
if ((Convert.IsDBNull(strObj)) || (strObj == null)) { return ""; }
else { return strObj.ToString().Trim(); }
}把这个放到公用类库里面,判断的时候调用即可。
if(Str_NullAsBlank(o)==Str_NullAsBlank(0)) { }
另外C#早就转入了高难度编程阶段——WPF,只是很多人不愿意接受,其最大的原因就是它入门太难了,比Java难多了,绝对不是初学者可以接受的程度,说C#简单的只是停留在WinForm的桌面编程上而已,拖拉控件自然没难度。
在Java中,String是字符串常量。由相同序列的字符组成的两个字符串属于同一对象,位于内存中的同一个位置。
var b = (object)"0"== (object)"0";
实际上赋值语句的右边的两个 "0"的强制类型转换产生了2个引用类型。也就是在托管堆里面是2个不一样的地址。
如果说string是引用类型,那为何
string a="0";
string b="0";
bool c = a==b; c的结果为true呢,那是因为实际语义上的原因,.netframework中重写了string类的Equal方法,
两者的相等性判断是以2个变量的内容为依据,而不是比较引用地址。