小鱼儿-fly

c#,ASP.NET 一条艰辛而漫长的道路...千里之行,始于足下!

导航

C# 相等问题

Posted on 2010-10-29 14:04  小鱼儿-fly  阅读(369)  评论(0编辑  收藏  举报

1."==":比较两个变量的值是否相等

值类型,若对象的值相等,则"=="返回true,否则返回false

string类型,==比较字符串的值。

对于string 以外的引用类型,若两个对象引用同一个对象,则"=="返回true

 

2. equals()方法比较的是两个对象的内容是否一致。对已引用类型就是比较的是否是同一个对象的引用。

 

a. string类型:未开辟新内存空间,使用的还是a的内存空间,相当于a对象,它们两个在堆中使用的是一个内存空间.当建立b时,先在堆中查找有没有 所需要的内容,有的话,就直接指向,没有的话就新建一个
   string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
        string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });       

        Console.WriteLine (a==b);                                         //输出true
        Console.WriteLine (a.Equals(b));                                //输出true

b.object:在堆中开辟新的内存空间,对象内容与c是不同的,与字符串对象不同,这样的对象建立的时间,不用在堆中查找有没有相同的内容,直接在堆内存中开辟一块新的内存空间.
   object c = new object();
        object d = new object();           

        Console.WriteLine(c == d);   //输出false,因为cd它们两个在栈中的内容不一样
        Console.WriteLine(c.Equals(d));  
//输出false,因为虽然建立cd时所用的语法是一样的,但终究它们不是相同的对象,只有用object d=c;这样才是相同的对象

c. 新建立对象f,这时把已经有的对象赋给f,这样f就不会在堆内存中开辟新的内存空间,而是直接把,e的引用传给f,也就是把e在栈中的引用值,传到f在栈中的内存中.这样它们就同时指向了相同的椎内存.
    object e = new object();
         object f = e;                           

    Console.WriteLine(e == f);
        Console.WriteLine(e.Equals(f));//均输出true


说明equals比较的是堆中的内容,也就是两个对象的内容;而==比较的是值,也就是栈中的内容.

 

总结,用string 建立新对象时,会在内存中查找有没有相同的内容,有的话,直接把新建立的对象指过去,没有的话,就在堆中开辟新的内存空间.这个string对象还是比较特殊的.
而用其它类新建立的对象,就没有在堆中查找的步骤,直接在堆内存中开辟一块新的内存空间.当然不包括下面这种形式:   
object e = new object();
object f = e;
把新建立的对象以原有的对象赋值,这样就不会在堆内存中开辟新的空间.

 

3.compare(a,b):比较两个字符串是否相等,有很多重载方法

逐次比较a,b的ascII码。a<b返回-1;a>b返回1;a和b相等返回0;

a.CompareTo("b") 与compare的区别是 是以实例对象本身与指定的字符串作比较。

 

总结:
"=="用于值比较,返回的是true或false。
equals不仅可以用值比较,还可以用对象比较,对象比较时比较对象是否为同一个实例。返回的是true或false。
compareto用于值比较,如果参数字符串等于此字符串,则返回 0 值;如果按字典顺序此字符串小于字符串参数,则返回一个小于 0 的值;如果按字典顺序此字符串大于字符串参数,则返回一个大于 0 的值。

 

来自: http://hi.baidu.com/elite360022/blog/item/e9faa152ba2467020cf3e344.html