ReferenceEquals,==,Equals比较

ReferenceEquals,==,Equals比较


作者: Leafwiz  &;nbsp来自:网络


                1.      ReferenceEquals, == , Equals
 
  Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不是相等。
 
  a)      ReferenceEquals
 
  ReferenceEquals是Object的静态方法,用于比较两个引用类型的对象是否是对于同一个对象的引用。对于值类型它总是返回false。(因为Box以后的对象总是不同的,hehe)
 
  b)      ==是一个可以重载的二元操作符,可以用于比较两个对象是否相等。
 
  对于内置值类型,==判断的是两个对象的代数值是否相等。它会根据需要自动进行必要的类型转换,并根据两个对象的值是否相等返回true或者false。例如:
 
        Int a = 100;
 
        Double b =100;
 
        If(a == b)
 
                Console.WriteLine(“equal supports compare between different types!”);
 
  上面这段程序将会输出:
 
  equal supports compare between different types!
 
       
 
  而对于用户定义的值类型,如果没有重载==操作符,==将是不能够使用的。例如:
 
  Struct Userstruct1;
 
  Userstruct1 a;
 
  Userstruct1 b;
 
  If(a == b)
 
  Console.WriteLine(“can == reach this far?”)
 
  上面的这段代码是不能够通过编译的。可以通过重载使==作用于用户定义的值类型。
 
 
        对于引用类型,== 默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时候才返回true。但是.NET Framework中的类很多对==进行了重载,例如String类的==与Equals的行为相同,判断两个字符串的内容是否相等。所以在应用中,对于系统定义的引用类型建议不要使用==操作符,以免程序出现与预期不同的运行结果。
 
 
 
  c)      Equals 作为Object内置方法,Equals支持对于任意两个CTS对象的比较。
 
  Equals它有静态方法和可重载的一个版本,下面的程序片断解释了这两个方法的用法,
 
  int a = 5;
 
  int b = 5;
 
  If(Object.Equals(a ,b))
 
  // you can also use if(a.Equals(b))
 
  {
 
    Console.WriteLine(“a is equal to b”);
 
  }
 
  事实上,这两个版本的结果完全相同,如果用户重载了Equals,调用的都是用户重载后的Equals。Equals的静态方法的好处是可以不必考虑用于比较的对象是否为null。
 
 
 
  Equals方法对于值类型和引用类型的定义不同,对于值类型,类型相同,并且数值相同(对于struct的每个成员都必须相同),则Equals返回true,否则返回false。而对于引用类型,默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时候才返回true。可以根据需要对Equals进行重载,例如String类的Equals用于判断两个字符串的内容是否相等。
 
              StringBuilder a = new StringBuilder();
 
              a.Append("the test a");
 
              String s1 = a.ToString();
 
              String s2 = "the test a";
 
              if (s2 == s1)
 
                  Console.WriteLine("== returns true");
 
              if (Object.Equals(s2, s1))
 
              {
 
                  Console.WriteLine("equals returns true");
 
              }
 
              if (Object.ReferenceEquals(s2, s1))
 
              {
 
                  Console.WriteLine("ReferenceEquals returns true");
 
              }
 
  这个实例将输出:
 
  == returns true
 
  equals returns true
 
 
 
        注:对于String类,直接声明s1 = “the test a”的话,输出结果将包含
 
  "ReferenceEquals returns true",
 
  因为默认的,String对于声明的相同的字符串在堆上只保留一个Copy,所以s1与s2将会指向相同的Reference,
    (2005-5-09:09:47)
 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 警告:持续变种木马正在发起农历新年攻势!
 您可能对 [C#] 的这些文章也感兴趣:
开放源码阵营加入Microsoft.NET利大于弊
C#,是宣传还是有用的技术?
如何更好更快的debug
用C#制作的.NET开发工具
c#中对文件的操作小结
Net是未来的趋势,为什么?
另类的VS.NET的资源
DotNETWinFormFAQ16个(下)
DotNETWinFormFAQ16个(上)
"谁持彩练当空舞"--看Java、C#大比拚(1)
用VisualC#获得计算机名称和IP地址
"谁持彩练当空舞"--看Java、C#大比拚(3)