F#中显式成员字段和自动属性之间的区别

时间:2013-11-07 19:31:40

标签: f# unity3d

在Unity3D中,我们可以通过将其标记为公共内容来在编辑器中访问字段。然后,这允许在GUI中分配字段的变量,而不是对其进行硬编码。例如,此C#代码将显示可在开发期间手动编辑的“速度”字段。如果保持不变,它将默认为10:

public class Example : MonoBehaviour {
    public float speed = 10.0F; 
}

我尝试使用automatic properties在F#中执行此操作:

type Example() =
    inherit MonoBehaviour()
    member val speed = 10.f with get,set 

但这不起作用。但是,如果我使用explicit properties

,它确实有效
[<DefaultValue>] val mutable speed : float32

但这样做的缺点是无法在同一个表达式中指定默认值。

是不是显式和自动属性编译成同一个东西,唯一的区别是显式属性总是初始化为零?如何在F#中声明等效的C#代码?

3 个答案:

答案 0 :(得分:4)

我认为你混淆了两个不同的概念:显式字段和自动属性。虽然访问/分配在语法上是相似的,但是在引擎盖下,属性更像是方法而不是字段。你的C#的F#等价物是:

type Example() as this =
  [<DefaultValue>] val mutable public speed: float32;
  do this.speed <- 10.0f

答案 1 :(得分:4)

我认为你正在玩loosely with the terms "field" and "property"

The Unity editor doesn't bind properties automatically,您提供的第一个示例是F#的自动属性。对于记录,您无法在Unity编辑器窗格中绑定以下C#:

// does not bind in editor either
class Example : MonoBehavior { 
    public float speed { get; set; }
}

您必须将代码与[DefaultValue]一起使用,并在构造函数中将其初始化,或者使用标记为[SerializeField]的自定义私有字段并编写您自己的属性包装器:

type Example () = 
    [<SerializeField>]
    let mutable _speed = 10f
    member this.speed 
        with get () = _speed 
        and set val = _speed <- val

答案 2 :(得分:1)

实现此目的的另一种方法是避免[<DefaultValue>]和命令式初始化,如下所示(注意第一行没有默认构造函数):

type Example =
    val mutable public speed : float32
    new() = { speed = 10.0f }