结构 (F#)

结构是一种精简的对象类型,对于数据量小、行为简单的类型,它要比类更有效率。

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

备注

结构属于值类型,这意味着,结构直接存储在堆栈中,或者在用作字段或数组元素时内联在父类型中。与类和记录不同,结构具有按值传递的语义。这意味着,结构主要用于经常访问和复制的小型数据聚合。

前面的语法中显示了两种形式。第一种形式并非轻量语法,但仍会经常用到,因为当使用 struct 和 end 关键字时,您可以忽略第二种形式中显示的 StructAttribute 特性。可以将 StructAttribute 缩写为 Struct。

前面语法中的 type-definition-elements 表示成员声明和定义。结构不仅可以具有构造函数、可变字段和不可变字段,还可以声明成员和接口实现。有关更多信息,请参见成员 (F#)

结构不能参与继承、不能包含 let 或 do 绑定,并且也不能以递归方式包含其自身类型的字段(尽管结构可以包含引用其自身类型的引用单元格)。

由于结构不允许 let 绑定,因此您必须使用 val 关键字在结构中声明字段。val 关键字可定义字段及其类型,但不允许初始化。而是应将 val 声明初始化为零或 null。出于此原因,包含隐式构造函数(即,声明中紧跟结构名称给出的参数)的结构要求使用 DefaultValue 特性批注 val 声明。包含已定义的构造函数的结构仍然支持零初始化。因此,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#)