對于初學面向對象的人來說,往往很疑惑什麼是對象,什麼是類。在面向對象的程式設計領域中,我們需要明确一個事實:所有的類型必須被明确的表示,而不是被其他資料類型來替代。
類是 C# 中功能最為強大的資料類型,它定義了資料類型的資料和行為。然後,程式員可以建立作為此類的執行個體的對象。類支援繼承,而繼承是面向對象程式設計的基礎部分。
比如我們在前面了解的一個關于洗牌的過程,在前面的代碼中,我們計算和産生的不是真正意義上的撲克牌,而是字元串!
如果要真正的描述撲克牌,我們必須要有一個撲克牌的資料類型,而這個類型.NET Framework顯然沒有提供,是以我們需要自己編寫一個撲克牌的類型。是以我們需要定義一個撲克牌的類型,我們把自己定義的類型一般稱為類。
/// <summary>
/// 撲克牌
/// </summary>
public class Poker
{
/// 撲克牌的花色
public string Style;
/// 撲克排的牌面
public string Title;
/// 撲克牌的值
public int Value;
}
上述代碼描述我們使用關鍵字class定義了一個類,該類的名字叫Poker。這個類中定義了3個變量:Style、Title和Value。
class 關鍵字前面是通路級别。由于在該例中使用 public,是以任何人都可以基于該類建立對象。類的名稱位于 class 關鍵字的後面。定義的其餘部分是類的主體,用于定義行為和資料。類的字段、屬性、方法和事件統稱為“類成員”。
要使用這個類,我們需要對其執行個體化。所謂的執行個體化,說白了就是通知編譯器到記憶體中開辟一個空間,以存儲一些值。通過使用 new 關鍵字(後跟對象将基于的類的名稱)可以建立對象:
Poker pokerA = new Poker(); //執行個體化Poker類
Poker pokerK = new Poker(); //執行個體化Poker類
建立類的執行個體後,将向程式員傳遞回對該對象的引用。在前面的示例中,pokerA和pokerK是對基于 Poker的對象的引用。此引用引用新對象,但不包含對象資料本身。
static void Main(string[] args)
pokerA.Style = ((char)4).ToString();
pokerA.Title = "A";
pokerA.Value = 1;
System.Console.WriteLine("{0}{1}", pokerA.Style, pokerA.Title);
pokerK.Style = ((char)4).ToString();
pokerK.Title = "K";
pokerK.Value = 13;
System.Console.WriteLine("{0}{1}", pokerK.Style, pokerK.Title);
我們得到的結果如圖3.3.1:
圖3.3.1
Poker pokerA = new Poker()和Poker pokerK = new Poker()代碼用以産生一個執行個體化Poker對象。通俗的說就是,通知編譯器,我需要一個新的空間,這個空間請按Poker類的定義來配置設定空間,并且命名為pokerA或pokerK。而Style、Title和Value是Poker類的值,存儲了Poker具體的内容。
如果要比較兩張牌對象有兩種方案:
一、比較兩張牌對象是不是在同一個記憶體空間,如果是的話,這兩個對象完全相等。
二、比較兩張牌對象的值是不是各自相等,如果是的話,表示這兩張牌的值或牌面一樣。
Poker pokerA1 = new Poker(); //執行個體化Poker類
pokerA1.Style = ((char)4).ToString();
pokerA1.Title = "A";
pokerA1.Value = 1;
System.Console.WriteLine("{0}{1}", pokerA1.Style, pokerA1.Title);
Poker pokerA2 = new Poker(); //執行個體化Poker類
pokerA2.Style = ((char)4).ToString();
pokerA2.Title = "A";
pokerA2.Value = 1;
System.Console.WriteLine("{0}{1}", pokerA2.Style, pokerA2.Title);
System.Console.WriteLine(pokerA1 == pokerA2); //在兩個記憶體空間中,兩個對象不相等
運作的結果如圖3.3.2:
圖3.3.2
初學者很不了解對象的相等和對象的值相等是什麼意思,用一個通俗的場景來說,有兩個雙胞胎兄弟,長的是一模一樣,它們的衣服值一樣,它們的外觀值一樣,它們的所有的一切的值都一樣,但它們就是兩個人,而不能說是同一個人。
而筆者名字叫“王豫翔”,在QQ的昵稱上叫“熾天使”,MSN叫“害羞的獅子王”,但其實都是同一個人。
以下代碼描述了兩個對象相等,初學者要牢記,如果兩個對象相等,任意的對象改變的值,會影響另一個對象的值,因為它們使用的是共同的記憶體。
pokerA2 = pokerA1; //将pokerA1的記憶體空間的位址指派給pokerA2
System.Console.WriteLine(pokerA1 == pokerA2);
System.Console.WriteLine(pokerA1.Value == pokerA2.Value);
pokerA2.Style = ((char)5).ToString(); //pokerA2改變了花色
System.Console.WriteLine("{0}{1}", pokerA1.Style, pokerA1.Title); //pokerA1的花色值也改變了
觀察圖3.3.3結果,并了解對象的引用關系。
<a href="http://blog.51cto.com/attachment/201203/222918792.jpg" target="_blank"></a>
圖3.3.3
初學者注意
出現上述原因是應為C#的資料類型分為:值類型和引用類型。對象是引用類型。具體的細節在後面我們将逐漸介紹,稍安毋躁。
本文轉自shyleoking 51CTO部落格,原文連結:http://blog.51cto.com/shyleoking/805131