最近寫程式遇到的C#基本觀念問題--物件比對,原本信仰不夠堅定,就被唬住了。

特別整理一份隨堂考題給大家溫故知新,也順便確認自己信仰正確,意志堅定。

請使用大腦編譯並執行以下程式碼,回答其中10題比對測試的結果:

using System;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //Integer Comparison
            int a = 1, b = 1;
            Console.WriteLine("1.{0}", a == b);
            Console.WriteLine("2.{0}", a.Equals(b));
 
            //Boxing
            object oa = 1, ob = 1;
            Console.WriteLine("3.{0}", oa == ob);
            Console.WriteLine("4.{0}", oa.Equals(ob));
 
            //Ref Comparison
            object oc = oa;
            Console.WriteLine("5.{0}", oa == oc);
            
            //Class Comparison
            C1 c1x = new C1() { Data = "AAA" },
                c1y = new C1() { Data = "AAA" },
                c1z = c1x;
            Console.WriteLine("6.{0}", c1x == c1y);
            Console.WriteLine("7.{0}", c1x == c1z);
            Console.WriteLine("8.{0}", c1x.Equals(c1y));
 
            //Class Comparison 2
            C2 c2x = new C2() { Data = "AAA" },
                c2y = new C2() { Data = "AAA" };
            Console.WriteLine("9.{0}", c2x == c2y);
            Console.WriteLine("10.{0}", c2x.Equals(c2y));
            
            Console.Read();
        }
 
        class C1
        {
            public string Data = "";
        }
        class C2
        {
            public string Data = "";
            public static bool operator ==(C2 x, C2 y)
            {
                return x.Data == y.Data;
            }
            public static bool operator !=(C2 x, C2 y)
            {
                return x.Data != y.Data;
            }
        }
 
    }
}

黑暗助教題解如下:

  1. True
    送分題,身為C#程式師還答錯,千萬別讓人知道,不然有被解僱的危險。
  2. True
    大家也許不常這樣用Equals(),但應該不難猜對。
  3. False
    在這題中,object oa = 1這種寫法會發生Boxing(發生Boxing/Unboxing時會影響效能,能免則免),變出兩個新物件oa, ob,而object是Reference Type,==運算子只有在兩個變數指向同一個物件時才會傳回True。而oa, ob被包成兩個不同物件,本題為False。
  4. True
    object.Equals()能正確處理Boxed Value Type,比對被包在其中的int。
  5. True
    oa, oc指向同一個object實體(Instance),符合Reference Type ==比對的本意,本題為True。
  6. False
    前面說過,Class C1是Reference Type,指向不同物件實體,即便內容相同,==比對仍為False。
  7. True
    c1x, c1z指向同一個C1 Instance,故==比對傳回True。
  8. False
    Reference Type類別預設的Equals()也是比對是否指向同一Instance,故結果與==同。
  9. True
    C2有實作==, !=運算子,會比對Data屬性決定是否相等,故傳回True。
  10. False
    C2只實作==, !=,懶惰沒override Equals(),同8.,一樣以False收場。

【延伸閱讀】


Comments

# by Aramis

黑暗大的考題讓我重新釐清了一些觀念,現在才知道string.Equals是特例...(汗)

Post a comment