C#隨堂考-object超級比一比
1 |
最近寫程式遇到的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;
}
}
}
}
黑暗助教題解如下:
- True
送分題,身為C#程式師還答錯,千萬別讓人知道,不然有被解僱的危險。 - True
大家也許不常這樣用Equals(),但應該不難猜對。 - False
在這題中,object oa = 1這種寫法會發生Boxing(發生Boxing/Unboxing時會影響效能,能免則免),變出兩個新物件oa, ob,而object是Reference Type,==運算子只有在兩個變數指向同一個物件時才會傳回True。而oa, ob被包成兩個不同物件,本題為False。 - True
object.Equals()能正確處理Boxed Value Type,比對被包在其中的int。 - True
oa, oc指向同一個object實體(Instance),符合Reference Type ==比對的本意,本題為True。 - False
前面說過,Class C1是Reference Type,指向不同物件實體,即便內容相同,==比對仍為False。 - True
c1x, c1z指向同一個C1 Instance,故==比對傳回True。 - False
Reference Type類別預設的Equals()也是比對是否指向同一Instance,故結果與==同。 - True
C2有實作==, !=運算子,會比對Data屬性決定是否相等,故傳回True。 - False
C2只實作==, !=,懶惰沒override Equals(),同8.,一樣以False收場。
【延伸閱讀】
- Equality in C# (其中關於string比對一節值得一看)
- MSDN: Object.Equals 方法 (Object)
- MSDN: Boxing 和 Unboxing (C# 程式設計手冊)
Comments
# by Aramis
黑暗大的考題讓我重新釐清了一些觀念,現在才知道string.Equals是特例...(汗)