【问题标题】:F# Object constructorF# 对象构造函数
【发布时间】:2014-03-25 12:24:25
【问题描述】:

在经历了很长时间的 F# 之后,最近学习了一点 C#,我开始意识到“对象构造函数”是一种很好的方法,可以让自己相信他们正在处理一个函数对象。

考虑:

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

这感觉很不干净,因为值的变化非常明显。尤其是如果我们让我们的对象只写一次,感觉非常没必要在C#中,可以这样初始化对象:

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

这看起来更好,实际上感觉就像我在使用唱片(几乎),显然它只是糖,但它的糖很好。

问。假设我们无法控制“某事”(假装它来自某个 C# 库),是否可以在 F# 中使用这种速记初始化,如果不能,为什么?

【问题讨论】:

标签: oop properties constructor f# initialization


【解决方案1】:

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

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

语法在“在初始化时为属性赋值”部分下的Constructors (F#) 中有详细说明。

【讨论】:

    【解决方案2】:

    是的,F# 支持类似于 C# 对象初始化器的用例,但 F# 方法更通用。 F# 规范 14.4 Method Application Resolution 说:

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

    • 对于目标是可设置属性或字段的每个 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-20
      • 2021-10-22
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多