C# 語法學習_Lesson 5
類別與物件
class(類別)是C#最基本的型別,類別是一個結合狀態(fields)和動作(methods & function members)於一個單元的資料結構,類別可以為動態建立的類別「instance」 (稱為「object」 ) 提供定義。
class可以支援物件導向概念中的繼承(inheritance)和多型(polymorphism),因為這樣的機制,所以base class(基底類別)是可以被擴展(衍生類別)或是特製化。
建立新類別時,是使用類別宣告來建立。類別宣告的開頭是一個標頭,此標頭會指定類別的屬性和修飾詞、類別的名稱、基底類別 (如果提供),以及類別所實作的介面。此標頭後面會接著類別主體,此主體是由在 { 與 } 分隔符號之間撰寫的成員宣告清單所組成。
以下是一個名為 Point 之簡單類別的宣告:
1 | public class Point |
建立類別執行個體(instance)時,是使用 new 運算子來建立,此運算子會為新執行個體配置記憶體、叫用建構函式來將執行個體初始化,然後傳回對執行個體的參考。 下列陳述式會建立兩個 Point 物件,並以兩個變數儲存對這些物件的參考:
1 | Point p1 = new Point(0, 0); |
當物件(object)已經無效時,其所佔用的記憶體空間,將會自動被釋放,在 C# 中,既沒有必要也不可能很明確地將解除物件配置的記憶體空間。
成員(members)
類別的成員不是靜態成員,就是執行個體成員,靜態成員隸屬於類別,而執行個體成員則隸屬於物件 (類別的執行個體)。
以下提供類別所能包含之成員類型的概觀。常數(Constants)
與類別關聯的常數值欄位(Fields)
類別的變數方法(Methods)
類別所能執行的計算和動作屬性(Properties)
與讀取和寫入具名的類別特性關聯的動作索引子(Indexers)
與編製陣列之類的類別執行個體關聯的動作事件(Events)
類別所能產生的通知運算子(Operators)
類別所支援的轉換和運算式運算子建構函式(Constructors)
將類別執行個體或類別本身初始化所需的動作完成項(Finalizers)
在永久捨棄類別執行個體之前所要執行的動作型別(Types)
類別所宣告的巢狀型別
輔助項目
類別中的每個成員都有一個關聯存取的能力,用來控制能夠存取成員的程式碼區塊,取能力有六種可能的形式。 以下為摘要說明。
public
存取不受限制protected
存取僅限於此類別或此類別所衍生的類別internal
存取限於目前組件 (.exe、.dll 等)protected internal
存取限於包含類別、衍生自包含類別的類別,或同組件中的類別private
存取僅限於此類別private protected
存取限於包含類別或衍生自同組件中包含類型的類別
型別參數
類別定義可以在類別名稱後面以角括弧括住型別參數名稱清單,來定義一組型別參數。 接著,就可以在類別宣告的主體中使用這些型別參數,來定義類別的成員。 在下列範例中,Pair 的型別參數是 TFirst 和 TSecond:
1 | public class Pair<TFirst,TSecond> |
類別型別若宣告為會採用型別參數,即稱為「泛型類別型別」 。 結構、介面及委派型別也可以是泛型型別。 使用泛型類別時,必須為每個型別參數提供型別參數:
1 | Pair<int,string> pair = new Pair<int,string> { First = 1, Second = "two" }; |
基底類別
類別宣告可以在類別名稱和型別參數後面加上冒號和基底類別的名稱,來指定基底類別。 省略基底類別規格即等同於衍生自類型 object。 在下列範例中,Point3D 的基底類別是 Point,而 Point 的基底類別是 object:
1 | public class Point |
類別會繼承其基底類別的成員。 繼承意謂著類別隱含地包含其基底類別的所有成員,但不包含基底類別中的instance,靜態建構子及完成項。衍生類別可以在其繼承的成員中新增新的成員,但無法移除所繼承成員的定義。 在先前的範例中,Point3D 會從 Point 繼承 x 和 y 欄位,而每個 Point3D 執行個體都會包含 x、y 及 z 這三個欄位。
在類別型別和其任何基底類別型別之間都存在著隱含轉換。 因此,類別型別的變數可以參考該類別的執行個體,或任何衍生類別的執行個體。 例如,以先前的類別宣告為例,Point 型別的變數可以參考 Point 或 Point3D:
1 | Point a = new Point(10, 20); |