共用方式為


結構 (F#)

「結構」(structure) 是一種精簡的物件類型,比起有少量資料和簡單行為的類型類別更有效率。

[ attributes ] type [accessibility-modifier] type-name =    struct       type-definition-elements    end // or [ attributes ] [<StructAttribute>] type [accessibility-modifier] type-name =    type-definition-elements

備註

結構是「實值類型」(value types),這表示它們會直接儲存在堆疊上,或是內嵌在父類型中 (當它們用以做為欄位或陣列元素時)。 有別於類別與記錄,結構具有以值傳遞的語意。 這表示它們主要對於經常存取及複製的小型資料彙總相當實用。

在先前的語法中,顯示了兩個表單。 第一個表單的語法略為複雜,但使用卻很頻繁,因為當您使用 struct 和 end 關鍵字時,可以省略出現在第二個表單中的 StructAttribute 屬性。 您可以將 StructAttribute 縮寫為只有 Struct。

先前語法中的 type-definition-elements 代表成員宣告與定義。 結構可以具有建構函式及可變動和不可變的欄位,同時它們可以宣告成員及介面實作。 如需詳細資訊,請參閱成員 (F#)

結構無法參與繼承、不能包含 let 或 do 繫結,且不得以遞迴方式包含其本身類型的欄位 (不過它們可以包含參考其本身類型的參考儲存格)。

因為結構不允許 let 繫結,因此您必須使用 val 關鍵字來宣告結構中的欄位。 val 關鍵字會定義欄位及其類型,但不允許進行初始化。 相反地,val 宣告會初始化為零或 null。 基於這個理由,具有隱含建構函式 (也就是緊接在宣告中結構名稱後的指定參數) 的結構,需要 val 宣告加上 DefaultValue 屬性的附註。 具有已定義的建構函式之結構,仍然支援零初始化。 因此,DefaultValue 屬性是一種零值對於欄位有效的宣告。 結構的隱含建構函式不會執行任何動作,因為類型上不允許 let 和 do 繫結,但傳入的隱含建構函式參數值均可用作為私用欄位。

明確建構函式可能會牽涉到欄位值的初始化。 當您的結構有明確的建構函式時,它仍然可以支援零初始化。不過,請勿在 val 宣告上使用 DefaultValue 屬性,因為它與明確建構函式相衝突。 如需 val 宣告的詳細資訊,請參閱明確欄位:val 關鍵字 (F#)

結構上允許屬性和存取範圍修飾詞,並遵循與其他類型相同的規則。 如需詳細資訊,請參閱屬性 (F#)存取控制 (F#)

下列程式碼範例說明結構定義。

// In Point3D, three immutable values are defined. 
// x, y, and z will be initialized to 0.0. 
type Point3D =
   struct 
      val x: float
      val y: float
      val z: float
   end 

// In Point2D, two immutable values are defined. 
// Point2D has an explicit constructor. 
// You can create zero-initialized instances of Point2D, or you can 
// pass in arguments to initialize the values. 
type Point2D =
   struct 
      val X: float
      val Y: float
      new(x: float, y: float) = { X = x; Y = y }
   end

請參閱

參考

類別 (F#)

資料錄 (F#)

其他資源

F# 語言參考

成員 (F#)