訓練
模組
Get started with classes and objects in C# - Training
Learn how to create classes and instantiate objects that expose encapsulated field data by using class definitions, constructors, and the 'new' operator.
定義為 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# 語法及用法的限定來源。
訓練
模組
Get started with classes and objects in C# - Training
Learn how to create classes and instantiate objects that expose encapsulated field data by using class definitions, constructors, and the 'new' operator.