類別簡介
參考型別
定義為 class
的型別為「參考型別」。 在執行階段,當您宣告參照型別的變數時,該變數會包含值 null
,直到您使用 new
運算子明確地建立類別的執行個體,或為它指派在他處建立的相容型別物件為止,如下列範例所示︰
//Declaring an object of type MyClass.
MyClass mc = new MyClass();
//Declaring another object of the same type, assigning it the value of the first object.
MyClass mc2 = mc;
建立物件時,會在受控堆積上配置足夠的記憶體給該特定物件,而變數只會保留該物件位置的參考。 物件使用的記憶體由 CLR 的自動記憶體管理功能回收,這稱為記憶體回收。 如需記憶體回收的詳細資訊,請參閱自動記憶體管理和記憶體回收。
宣告類別
宣告類別時需使用後方接著唯一識別碼的 class
關鍵字,如下列範例所示:
//[access modifier] - [class] - [identifier]
public class Customer
{
// Fields, properties, methods and events go here...
}
選擇性存取修飾詞在 class
關鍵字前面。 class
型別的預設存取權為 internal
。 由於此例使用 public
,所有人都可以在這個類別建立執行個體。 類別的名稱遵循 class
關鍵字。 類別名稱必須是有效的 C# 識別碼名稱。 定義的其餘部分是定義行為和資料的類別主體。 類別上的欄位、屬性、方法和事件統稱為「類別成員」。
建立物件
雖然它們有時會交換使用,但是類別和物件不同。 類別會定義一種類型的物件,但不是物件本身。 物件是根據類別的具體實體,而且有時稱為類別的執行個體。
建立物件時,可使用 new
關鍵字,後方接著類別的名稱,如下所示:
Customer object1 = new Customer();
建立類別的執行個體時,會將物件的參考傳回給程式設計人員。 在上述範例中,object1
是根據 Customer
之物件的參考。 這個參考參照新的物件,但不包含物件資料本身。 事實上,您可以建立物件參考,而根本不需要建立物件︰
Customer object2;
不建議建立未參照物件的物件參考,因為在執行階段嘗試透過這類參考來存取物件會失敗。 參照也可參照物件,方法是建立新的物件,或將它指派給現有物件,如下︰
Customer object3 = new Customer();
Customer object4 = object3;
這個程式碼會建立同時參照相同物件的兩個物件參考。 因此,任何透過 object3
進行的物件變更都會反映在後續使用 object4
時。 因為以傳址方式參照根據類別的物件,所以類別稱為參考型別。
建構函式和初始化
上述各節介紹了宣告類別類型的語法,並建立該類型的執行個體。 當您建立類型的執行個體時,您想要確保其欄位和屬性已初始化為有用的值。 初始化值有好幾種方式:
- 接受預設值
- 欄位初始設定式
- 建構函式參數
- 物件初始設定式
每個 .NET 類型都有預設值。 一般而言,該值針對數字類型為 0,而針對所有參考類型為 null
。 在應用程式中合理時,您可以依賴該預設值。
當 .NET 預設值不是正確的值時,您可以使用欄位初始設定式來設定初始值:
public class Container
{
// Initialize capacity field to a default value of 10:
private int _capacity = 10;
}
您可以定義負責設定初始值的建構函式,要求呼叫端提供初始值:
public class Container
{
private int _capacity;
public Container(int capacity) => _capacity = capacity;
}
從 C# 12 開始,您可以定義主要建構函式作為類別宣告的一部分:
public class Container(int capacity)
{
private int _capacity = capacity;
}
將參數新增至類別名稱會定義主要建構函式。 這些參數可在類別主體中取得,其中包含其成員。 您可以使用它們來初始化欄位或所需的任何位置。
您也可以在屬性上使用 required
修飾元,並且允許呼叫端使用物件初始設定式來設定屬性的初始值:
public class Person
{
public required string LastName { get; set; }
public required string FirstName { get; set; }
}
新增 required
關鍵字會強制呼叫端必須設定這些屬性作為 new
運算式的一部分:
var p1 = new Person(); // Error! Required properties not set
var p2 = new Person() { FirstName = "Grace", LastName = "Hopper" };
類別繼承
類別完全支援「繼承」,這是物件導向程式設計的基礎特性。 當您建立類別時,可以繼承自未定義為 sealed
的任何其他類別。 其他類別可以繼承自您的類別,並覆寫類別虛擬方法。 此外,您也可以實作一或多個介面。
使用「衍生」可完成繼承,這表示使用從中繼承資料和行為的「基底類別」來宣告類別。 附加冒號以及接著衍生類別名稱後面的基底類別名稱,以指定基底類別,與下面類似:
public class Manager : Employee
{
// Employee fields, properties, methods and events are inherited
// New Manager fields, properties, methods and events go here...
}
類別宣告包含基底類別時,會繼承基底類別的所有成員,但建構函式除外。 如需詳細資訊,請參閱繼承。
C# 中的類別只能從一個基底類別直接沿用。 不過,因為基底類別本身可以繼承自其他類別,所以類別可能會間接繼承多個基底類別。 此外,類別可以直接實作一或多個介面。 如需詳細資訊,請參閱介面。
類別可以宣告為 abstract
。 抽象類別包含具有簽章定義但沒有實作的抽象方法。 無法具現化抽象類別。 它們僅用於實作抽象方法的衍生類別。 相較之下,sealed 類別不允許從它衍生其他類別。 如需詳細資訊,請參閱抽象和密封類別以及類別成員。
類別定義可以在不同的原始程式檔之間進行分割。 如需詳細資訊,請參閱部分類別和方法。
C# 語言規格
如需詳細資訊,請參閱<C# 語言規格>。 語言規格是 C# 語法及用法的限定來源。