類別簡介

參考型別

定義為 class 的型別為「參考型別」。 在執行階段宣告參考型別的變數時,除非您使用 new 運算子明確建立類別的執行個體,或指派在他處建立的相容型別物件,否則該變數包含值 null,如下列範例所示:

//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 關鍵字前面。 由於此例使用 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# 語法及用法的限定來源。