F# F中显式成员字段和自动属性之间的差异#
在Unity3D中,我们可以通过将字段标记为公共字段,使其在编辑器中可访问。这样就可以在GUI中分配字段变量,而不是对其进行硬编码。例如,此C#代码将显示一个“速度”字段,可在开发过程中手动编辑。如果未修改,则默认为10:F# F中显式成员字段和自动属性之间的差异#,f#,unity3d,F#,Unity3d,在Unity3D中,我们可以通过将字段标记为公共字段,使其在编辑器中可访问。这样就可以在GUI中分配字段变量,而不是对其进行硬编码。例如,此C#代码将显示一个“速度”字段,可在开发过程中手动编辑。如果未修改,则默认为10: public class Example : MonoBehaviour { public float speed = 10.0F; } 我试着用F#做这件事: 但这不起作用。但是,如果我使用 []val可变速度:浮动32 但这样做的缺点是无法在同一表达式中指定
public class Example : MonoBehaviour {
public float speed = 10.0F;
}
我试着用F#做这件事:
但这不起作用。但是,如果我使用
[]val可变速度:浮动32
但这样做的缺点是无法在同一表达式中指定默认值
显式属性和自动属性的编译不是一回事吗?唯一的区别是显式属性总是初始化为零?我如何在F中声明C代码的等价物 我认为您混淆了两个不同的概念:显式字段和自动属性。在后台,属性更像是一个方法而不是一个字段,尽管访问/分配在语法上是相似的。F#相当于你的C#是:
type Example() as this =
[<DefaultValue>] val mutable public speed: float32;
do this.speed <- 10.0f
type Example()如下所示=
[]val可变公共速度:浮动32;
做这个。速度我想你在玩一点
,您提供的第一个示例是F#的自动属性。根据记录,您也无法在Unity编辑器窗格中绑定以下C#:
// does not bind in editor either
class Example : MonoBehavior {
public float speed { get; set; }
}
您必须将代码与[DefaultValue]
一起使用,并在构造函数中初始化它,或者使用标记为[SerializeField]
的let绑定私有字段,并编写自己的属性包装:
type Example () =
[<SerializeField>]
let mutable _speed = 10f
member this.speed
with get () = _speed
and set val = _speed <- val
类型示例()=
[]
设可变速度=10f
请记住,速度
使用get()=\u速度
设置val=_speed另一种实现方法,它避免了[]
和命令式初始化,如下所示(注意第一行没有默认构造函数):
它是如何失败的?如果不使用F#3.0,就不会获得自动属性。否则,您的问题是继承自MonoBehavior并试图重写一个字段,这是禁止的?失败是指Unity编辑器中没有显示任何字段,尽管如果我创建该类的实例,它仍然可以作为公共字段访问。而使用显式属性时,可以通过实例和编辑器访问该字段。两种情况下都没有编译错误。“速度”这个字段没有被覆盖,它是我编的。啊,我把概念搞混了。你的解决方案有效。听起来好像是我重读文档的时候了:-)我有一个问题:我也在用F#构建一个统一游戏。如何在visual studio中调试Unity F#代码?UnityVS有没有办法与F#合作?我已经试过了,但我似乎找不到一个方法来实现这一点…太好了!这更简洁,我可以把我所有的初始化放在一个地方。您甚至可以删除“public”修饰符,因为默认情况下VAL是公共的。
// does not bind in editor either
class Example : MonoBehavior {
public float speed { get; set; }
}
type Example () =
[<SerializeField>]
let mutable _speed = 10f
member this.speed
with get () = _speed
and set val = _speed <- val
type Example =
val mutable public speed : float32
new() = { speed = 10.0f }