C# 中的類別、結構和記錄概觀
在 C# 中,型別的定義是類別、結構或記錄,就像是指定型別用途的藍圖。 物件基本上是根據藍圖配置和設定的記憶體區塊。 本文提供這些藍圖及其功能的概觀。 本系列的下一篇文章介紹物件。
封裝
「封裝」有時被稱為物件導向程式設計的第一大支柱或原則。 類別或結構可以指定其各個成員對類別或結構外部程式碼的可存取性。 不應該在類別或組件之外使用的方法和變數,可隱藏以限制程式碼錯誤或惡意攻擊的可能性。 如需詳細資訊,請參閱物件導向程式設計教學課程。
成員
型別的成員包括所有方法、欄位、常數、屬性和事件。 和部分其他語言不同,在 C# 中並沒有全域變數或方法。 即使是程式進入點 Main
方法也必須在類別或結構內宣告 (當您使用最上層陳述式時隱含宣告)。
下列清單包含所有可能在類別、結構或記錄中宣告的各種成員。
- 欄位
- 常數
- 屬性
- 方法
- 建構函式
- 事件
- 完成項
- 索引子
- 運算子
- 巢狀類型
如需詳細資訊,請參閱成員。
協助工具選項
有些方法和屬性必須從類別或結構以外的程式碼呼叫或存取,稱之為用戶端程式碼。 其他方法和屬性可能只會在類別或結構本身中使用。 請務必限制程式碼的可存取性,以確保只有目標用戶端程式碼可以存取。 您可以使用下列存取修飾詞,指定用戶端程式碼可以存取型別及其成員的程度:
預設可存取性為 private
。
繼承
類別 (而不是結構) 支援繼承的概念。 衍生自另一個類別 (稱為基底類別) 的類別,會自動包含基底類別的所有 public、protected 和 internal 成員 (其建構函式和完成項除外)。
類別可宣告為抽象,這表示其一或多個方法沒有任何實作。 雖然抽象類別無法直接具現化,但是它們可以做為其他能提供遺失實作之類別的基底類別。 類別也可以宣告為密封,以防止其他類別繼承它們。
介面
類別、結構和記錄可以實作多個介面。 實作介面表示型別會實作介面中定義的所有方法。 如需詳細資訊,請參閱介面。
泛型型別
類別、結構和記錄可以使用一或多個型別參數加以定義。 當用戶端程式碼建立型別的執行個體時,便會提供型別。 例如,System.Collections.Generic 命名空間中的 List<T> 類別是以一個型別參數來定義。 用戶端程式碼會建立 List<string>
或 List<int>
的執行個體,以指定清單將保留的型別。 如需詳細資訊,請參閱泛型。
靜態型別
類別 (而不是結構或記錄) 可以宣告為 static
。 靜態類別僅可以包含靜態成員,且無法使用 new
關鍵字具現化。 類別的其中一個複本會在程式載入時載入至記憶體,其成員會透過類別名稱存取。 類別、結構和記錄可以包含靜態成員。 如需詳細資訊,請參閱靜態類別和靜態類別成員。
巢狀類型
類別、結構或記錄可以在另一個類別、結構或記錄中呈巢狀結構。 如需詳細資訊,請參閱巢狀型別。
部分型別
您可以在某個程式碼檔案中定義類別、結構或方法的某個部分,並在另一個程式碼檔案中定義另一部分。 如需詳細資訊,請參閱部分類別和方法。
物件初始設定式
您可以將值指派給其屬性,以具現化和初始化類別或結構物件,以及物件的集合。 如需詳細資訊,請參閱如何使用物件初始設定式初始化物件。
匿名類型
在不方便或沒有必要建立具名類別的情況下,您可以使用匿名型別。 匿名型別是由其具名資料成員所定義。 如需詳細資訊,請參閱匿名型別。
擴充方法
您可以藉由建立個別型別來「擴充」類別,而不用建立衍生類別。 該型別包含可以呼叫的方法,就像它們屬於原始型別一樣。 如需詳細資訊,請參閱擴充方法。
隱含類型區域變數
在類別或結構方法內,您可以使用隱含型別來指示編譯器在編譯時間判斷變數的型別。 如需詳細資訊,請參閱 var (C# 參考)。
記錄
您可以將 record
修飾元新增至類別或結構。 記錄是具有實值型相等的內建行為的型別。 記錄 (record class
或 record struct
) 提供下列功能:
- 使用不可變屬性建立參考型別的精簡語法。
- 實值相等。 如果某記錄型別的兩個變數具有相同的型別,且在每個欄位中,這兩個記錄的值都相等,則這兩個變數相等。 類別會使用參考相等:如果類別型別的兩個變數參考相同的物件,則兩個變數相等。
- 非破壞性變異的精簡語法。
with
運算式可讓您建立新的記錄執行個體,該執行個體是現有執行個體的複本,但指定的屬性值已變更。 - 用於顯示的內建格式設定。
ToString
方法會列印記錄型別名稱,以及公用屬性的名稱和值。 - 支援記錄類別中的繼承階層。 記錄類別支援繼承。 記錄結構不支援繼承。
如需詳細資訊,請參閱記錄。
C# 語言規格
如需詳細資訊,請參閱<C# 語言規格>。 語言規格是 C# 語法及用法的限定來源。