F#属性的快捷语法?

Ale*_*erg 28 f#

对于普通属性getter/setter语法

let mutable myInternalValue

member this.MyProperty 
    with get() = myInternalValue
    and set(value) = myInternalValue <- value
Run Code Online (Sandbox Code Playgroud)

是否有一个快捷方式,类似于C#中的以下内容?

someType MyProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

如果有的话,我似乎无法找到它......

ben*_*ruk 53

F#3具有自动实现的属性,因此您可以在不声明支持字段的情况下声明属性.

从MSDN上的属性(F#)获取的示例:

type MyClass() =
    member val MyProperty = "" with get, set
Run Code Online (Sandbox Code Playgroud)

  • 注意抽象属性的语法,即由接口声明的属性,使用 `abstract` 作为前缀关键字完全不同,省略了 `val` 关键字,但_可选地_保留了 `member` 关键字...... (2认同)

Tom*_*cek 11

在F#中没有创建get/ set属性的快捷方式,但如果您只想要一个属性,get可以使用以下简单语法:

type Test(n) =
  let myValue = n * 2
  member x.Property = 
    // Evaluated each time you access property value
    myValue + 5
Run Code Online (Sandbox Code Playgroud)

由于F#是一种函数式语言,因此F#类型通常是不可变的.这种语法使得定义不可变类型变得非常容易,因此它也鼓励您在F#中使用良好的函数式编程风格.

但是,我同意get/ setproperty 的快捷方式非常有用,特别是在编写需要与C#/其他.NET库进行互操作的代码时.

编辑(5年后......):这已经在F#3.0中添加了,因为Ben的答案显示:-)

  • @ Alexander - 不太确定这个场景,但是当我看到越来越多的代码,人们盲目地添加getter和setter(或者我有时听到他们调用的检查器和mutators)除了返回值或更改它之外什么都不做,更难以证明不仅仅是将价值观作为公共成员.我的意思是代码不会隐藏某些typedef背后的类型,只是简单地从类中读取一个成员,只是简单地设置类中的值也可能是公共的 - 毕竟它只是相同的耦合.也许F#强迫你添加它,如果你想要它,这是一件好事. (2认同)