F#对象构造函数

3

最近我学习了一点C#,之前主要使用F#。我发现‘对象构造函数’是一种让人误以为在处理函数式对象的好方法。

例如:

let x = new Something()
x.Key <- 1
x.Value <- 2

由于数值的明显变异,这让人感到非常不舒服。特别是如果我们保持对象只写一次,则感觉非常不必要。在C#中,可以像这样初始化对象:

var x = new Something() { Key = 1, Value = 2 };

这看起来更美观,实际上感觉就像使用记录一样(几乎),显然只是糖,但很好。
问:假设我们对`Something`没有控制权(假装它来自某个C#库),在F#中是否可能使用这种简写初始化方式?如果不行,为什么?

1
可能是对象初始化语法的重复问题。 - Mauricio Scheffer
绝对是重复项,双重搜索失败! :( - user1158550
2个回答

5

是的,你可以这样做。代码看起来像这样:

let x = new Something(Key = 1, Value = 2)

语法详见F#构造函数中的“初始化时为属性赋值”章节。


3
是的,F#支持类似于C#对象初始化程序的用例,但F#的方法有些更加通用。F#规范14.4方法应用分辨率说:

(在方法成功解析后)按照以下步骤构建结果详细表达式:

  • 对于每个目标为可设置属性或字段的NamedActualArgs,将值分配到属性中。

这意味着您可以做C#不允许的事情。

type Something() = 
    member val Key = 0 with get,set
    member val Value = "" with get,set
    static member Create() = Something()

let a = Something(Key = 1, Value = "1") // create instance with constructor, set properties afterwards
let b = Something.Create(Key = 1, Value = "1") // create instance using factory method, set properties afterwards

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接