设为首页收藏本站|繁體中文 快速切换版块

 找回密码
 立即加入
搜索
查看: 940|回复: 0

C#的==运算符和Equals()方法区别

[复制链接]
  • TA的每日心情
    慵懒
    2016-4-21 12:07
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    累计签到:3 天
    连续签到:1 天
    发表于 2010-5-10 08:24:45 | 显示全部楼层 |阅读模式

    马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!

    您需要 登录 才可以下载或查看,没有账号?立即加入

    ×
    using System;4 M+ m7 O  N9 k3 {5 i- W
    using System.Collections.Generic;" Y! i9 p; j$ M! w* r4 B+ M2 c
    using System.Text;
    * U8 z5 @4 ]1 S8 D2 bnamespace ConsoleApplication1$ c5 r" E. j6 @3 u; a6 d) F' }# z
    {, d. V4 Z% x) u; {( r- H* D0 e
        class Person
    . {2 b8 U+ R6 G1 D, S% L, }) V    {# C( P* _' y; x8 |9 s! q3 ^, k/ O/ [
            private string name;
    ) `1 o* {3 a* r- v4 \" K        public string Name
    ( [: v5 n. _2 m+ C4 F        {
    3 {& O) {* r# a( G3 [0 K# r' p3 o# z            get { return name; }% ~2 F0 ?( }1 Z# p* r! Q9 |: j$ s: ]% u
                set { name = value; }! x' Y% ~8 K0 F% m7 ?; m
            }1 E# h; p) s8 [. D
    4 n/ e* E8 _( w6 I4 t; Z
            public Person(string name)
    4 W! o7 _1 E- u/ C9 l3 u        {
    5 }/ w; o7 M4 ^6 f# T9 u            this.name = name;- D2 m' u9 d# o5 N- a% [
            }+ u0 i! r5 U: S+ f3 M- }3 k8 d$ y
        }
    , c4 y$ k( m5 ^8 _* F$ i    class Program
    4 C: E9 {. P( T3 F5 H3 S& S    {0 `) ]7 Y& p/ T% D) x. @2 t# ~
            static void Main(string[] args)) z; R+ ^( X- t% ^8 E/ e7 I7 m
            {/ a+ U# c' I6 @0 a9 m  c' T& x
                string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });5 G9 O6 N8 _- B* l5 K1 D
                string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });& u) G8 o' I) e+ ]2 d$ h5 {
                Console.WriteLine(a == b);) B2 ?- I; U' d9 M8 t& c3 Q: N" C& \
                Console.WriteLine(a.Equals(b));# O- z' m& L  j9 d: D8 y9 E
                object g = a;
    1 U( Q. F0 ?% `3 K: Z* e5 v            object h = b;
    6 S. s- P7 w- e1 }( j8 R            Console.WriteLine(g == h);
    0 ]. `4 K  G$ P            Console.WriteLine(g.Equals(h));
    : J" L7 }8 Q% y6 D% ~9 Y            Person p1 = new Person("jia");
    ! [) }) e4 ?  v  s0 p/ Q7 k; P( y' P            Person p2 = new Person("jia");9 @; T9 t  A4 V, c% u( u+ g( u3 ]
                Console.WriteLine(p1 == p2);: _/ y6 y* Q3 o9 e4 g" w
                Console.WriteLine(p1.Equals(p2));
    ' K# k! z! r9 _# [% e            Person p3 = new Person("jia");
    , d1 Y+ I% o- B% e6 ?* Z            Person p4 = p3;
    6 C( q+ ?/ @; A- n8 f) J6 k            Console.WriteLine(p3 == p4);
    + F7 S) ~- I. |) x1 v6 U! \& O7 O            Console.WriteLine(p3.Equals(p4));0 k/ I0 R$ `8 v0 H* Q% B; M
                Console.ReadLine();- D+ ~" \4 ~; |/ T* f. b1 }
            }
    / p0 V$ \0 B6 k4 h9 {* i4 z    }
    % c; t+ k& j7 C}
    " y7 b; x( \: n) w* T. s答案为何为true true false true  false false true true4 |, s- g( Q4 k6 S$ i8 m& J
    因为值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。' ], t; E- G* J. p; c: {
      "==" : 操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。2 @  x% [( X* g4 H
      "equals" : 操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
    - b& P2 |; D5 l( O/ h, v3 n2 O    而字符串是一个特殊的引用型类型,在C#语言中,重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样。
    0 P; M( z. b2 D9 H" n9 }    因此在上面的例子中,第一对输出 ,字符串a和字符串b的两个比较是相等的。
    ) t+ R3 n* r) a    对于 第二对输出 object g = a 和object h = b ,  在内存中两个不同的对象,所以在栈中的内容是不相同的,故不相等。而g.equals(h)用的是sting的equals()方法故相等(多太)。如果将字符串a和b作这样的修改:
    ' M1 w# T' [, q' d( j; K        string a="aa";/ r- [8 u' p5 o9 s7 z
            string b="aa";
    8 H: i9 }2 X1 u0 u- K* p  u! Y# T' F' O则,g和h的两个比较都是相等的。这是因为系统并没有给字符串b分配内存,只是将"aa"指向了b。所以a和b指向的是同一个字符串(字符串在这种赋值的情况下做了内存的优化)。$ w& Z8 v' c7 ]/ m7 f
    对于p1和p2,也是内存中两个不同的对象,所以在内存中的地址肯定不相同,故p1==p2会返回false,又因为p1和p2又是对不同对象的引用,所以p1.equals(p2)将返回false。( N- L5 b/ Q( U" v1 ]
    对于p3和p4,p4=p3,p3将对对象的引用赋给了p4,p3和p4是对同一个对象的引用,所以两个比较都返回true。
    / o2 W6 {* ^& S$ kMSDN中就有介绍啊:
    0 d+ ~3 k1 A! T1 Z0 u9 J下面的规则概括了 Equals 方法和等号运算符 (==) 的实现准则:8 n6 j) n( _. F2 q; ^
    每次实现 Equals 方法时都实现 GetHashCode 方法。这可以使 Equals 和 GetHashCode 保持同步。3 }' e) k& b1 l/ q  o1 I
    每次实现相等运算符 (==) 时,都重写 Equals 方法,使它们执行同样的操作。这样,使用 Equals 方法的基础结构代码(如 Hashtable 和 ArrayList)的行为就与用相等运算符编写的用户代码相同。4 M) V4 j5 o$ q2 v7 j, E
    每次实现 IComparable 时都要重写 Equals 方法。
    5 k7 t/ M3 t8 w  A2 _( q实现 IComparable 时,应考虑实现相等 (==)、不相等 (!=)、小于 ( <) 和大于 (>) 运算符的运算符重载。% }7 w" `7 a: b% H/ V
    不要在 Equals、GetHashCode 方法或相等运算符 (==) 中引发异常。
    9 e. L* j5 ^# {6 p* O有关 Equals 方法的相关信息,请参见实现 Equals 方法。
    " M1 Q2 q! z$ u* \$ z' O0 L: ~+ b在值类型中实现相等运算符 (==)
    / m! D5 A3 p" N/ k- z7 u大多数编程语言中都没有用于值类型的默认相等运算符 (==) 实现。因此,只要相等有意义就应该重载相等运算符 (==)。) ]7 I1 H  z4 H! y! l& x
    应考虑在值类型中实现 Equals 方法,这是因为 System..::.ValueType 的默认实现和自定义实现都不会执行。
    $ o6 L; U6 N! V2 c+ b每次重写 Equals 方法时都实现相等运算符 (==)。5 E' V. N% ~% \1 H  p) r2 K
    在引用类型中实现相等运算符 (==)
    6 |8 C& }* z' S9 K3 w3 R大多数语言确实为引用类型提供默认的相等运算符 (==) 实现。因此,在引用类型中实现相等运算符 (==) 时应小心。大多数引用类型(即使是实现 Equals 方法的引用类型)都不应重写相等运算符 (==)。$ c" @3 t+ U  v" h2 z
    如果类型是 Point、String、BigNumber 等基类型,则应重写相等运算符 (==)。每当考虑重载加法 (+) 和减法 (-) 运算符时,也应该考虑重载相等运算符 (==)。" `" W' s$ Q8 u0 o& ^
    好了,下面是考题,相信答案大家都知道了。
    + h6 V0 p1 G8 d( V' p9 `            Console.WriteLine((2 + 2) == 4);/ D1 }! A. \- M3 q* z3 a! z) I" \3 ^9 I
                object s = 1;, Q- R) [/ \4 s. l/ J) \3 {
                object t = 1;5 p+ ]* ^6 d1 J1 t: O0 s, q/ \+ U  d2 s
                Console.WriteLine(s == t);
    " y' e. @' \+ |* a& N7 S            string a = "hello";
    9 U& w: r) f/ P            string b = String.Copy(a);
    ' l2 y* J) u1 z2 Q- x& q; k            string c = "hello";
    & R9 X' u- s* e# R) Z            Console.WriteLine(a == b);! r5 d, j) g; x2 Q6 S; q( o* `$ O
                Console.WriteLine((object)a == (object)b);+ m! C6 h$ ]6 }6 `3 J/ B$ w( Z: Y
                Console.WriteLine((object)a == (object)c);" Y0 [  h3 J# ]
    答案:TRUE, FALSE, TRUE, FALSE, TRUE
    "真诚赞赏,手留余香"
    还没有人打赏,支持一下
    楼主热帖
    帖文化:【文明发帖 和谐互动】 社区精神:【创新、交流、互助、共享】
    您需要登录后才可以回帖 登录 | 立即加入

    本版积分规则

    招聘斑竹

    小黑屋|手机版|APP下载(beta)|Archiver|电力研学网 ( 赣ICP备12000811号-1|赣公网安备36040302000210号 )|网站地图

    GMT+8, 2025-2-24 07:08

    Powered by Discuz! X3.5 Licensed

    © 2001-2025 Discuz! Team.

    快速回复 返回顶部 返回列表