用==比较两个object变量中的string到底是不是安全的?
我记得有人说相同的字符串是同一地址,那就算调用了object.ReferenceEquals也应该返回true才对吧?最可气的是,监视窗口里最后两行的值竟然不一样为什么呢。。

解决方案 »

  1.   

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

  2.   

    除非你调用Object的Equals方法,否则需要转换到实际类型上去。
    Object的Equals方法在调用时,会自动调用派生类的Equals方法,String继承Object,因此即使将String转换为了Object也无所谓,最终执行的是String的Equals,得到正确的结果。
      

  3.   

    ls都已回答,你比较的是object,此时调用的是object的=方法
      

  4.   

    楼主的问题是调试窗口最后两行的值为何不一样。我猜测可能是调试窗口没有对字符串进行驻留的缘故,因为我注意到运行编译后的object.ReferenceEquals("aa", "aa")返回true,但在调试窗口这个表达式返回false
      

  5.   

    从代码上看            object o = "0";
                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)的比较方法,所以一样的;不过为了可读性,我习惯用后面的方法。
      

  6.   

    建议回炉再把基础补一下,整天说c#简单,c#怎么怎么样,说实在的都是这些人把.net从业人员的档次拉低了
      

  7.   

    public static string Str_NullAsBlank(object strObj)
    {
       if ((Convert.IsDBNull(strObj)) || (strObj == null)) { return ""; }
       else { return strObj.ToString().Trim(); }
    }把这个放到公用类库里面,判断的时候调用即可。
    if(Str_NullAsBlank(o)==Str_NullAsBlank(0)) { }
      

  8.   

    object类型没有重载op_Equality,==直接比较引用。两个具有相同“值”的字符串变量一定引用同一个对象吗?两个具有相同“值”的字符串对象一定是同一个对象吗?当然不是,.NET是有字符串暂存这个特性,但它绝对不是“具有相同值的字符串对象总是同一个”。你给的例子通常应该是会被暂存的,我这里无论是监视窗口还是编译后运行二者都是同一个对象。至于Object.Equals,这是个虚函数,没什么好说的,和声明时类型无关。
      

  9.   

    “整天说c#简单,c#怎么怎么样,说实在的都是这些人把.net从业人员的档次拉低了”这句话赞成,就像有些人说,C#有垃圾回收器,不需要程序员管理内存一样。
      

  10.   

    你这话太过激了,什么叫没一个搞清的,是你自己没搞清而已,我都回答得很清楚了,再搞不清就去研究IL,那个最清晰,什么语法糖都抛开了,那个才是理解原理的最佳方式。
    另外C#早就转入了高难度编程阶段——WPF,只是很多人不愿意接受,其最大的原因就是它入门太难了,比Java难多了,绝对不是初学者可以接受的程度,说C#简单的只是停留在WinForm的桌面编程上而已,拖拉控件自然没难度。
      

  11.   

    "=="其实内部就调用了Equals()方法(这句不记得在哪看到的,不知道是真是假?如有误,待大神批斗),而Equals()是比较两个object对象,注意比较的是引用地址是否一致。但当需比较的两个对象是string类型的时候,因为string类内部重写了Equals()方法,即使两个字符串不是同一个引用,只要里面字符串一样也返回true.我〇分,求楼主施舍点555555
      

  12.   

    o.Equals(o1)//为什么你就没想过这样?面向对象的基础还是要扎实点
      

  13.   

    你是不是搞错了?这个好像是Java里面的:
    在Java中,String是字符串常量。由相同序列的字符组成的两个字符串属于同一对象,位于内存中的同一个位置。
      

  14.   

    string类型的对象是一个不可变对象,也就是说对同一个string变量的2次赋值会产生一个新的内存地址。
    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个变量的内容为依据,而不是比较引用地址。