共用方式為


結構 (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 Type),這表示它們會直接儲存在堆疊上,如果當做欄位或陣列項目使用,則會內嵌在父型別中。 不同於類別和記錄,結構有以傳值方式傳遞的語意。 這表示結構主要適用於經常存取及複製的小型資料彙總。

在上述語法中,顯示兩種形式。 第一個不是輕量型語法,但卻是常用的語法,因為當您使用 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# 語言參考