关于F#面向对象编程

时间:2009-07-31 13:36:06

标签: f# oop

我们在f#中创建类的方式存在这种二分法,这真的困扰我。我可以使用隐式格式或显式格式创建类。但是我想要的一些功能只能用于隐式格式,有些只能用于显式格式。

例如:

  1. 我不能在明确定义的类中使用let inline *(或let)。

  2. 在隐式定义的类中定义不可变公共字段(不是属性*)的唯一方法(我知道)是val bla : bla语法。

    但这里有一个冗余。因为我最终会得到两个相同的不可变数据副本,一个私有,一个公共(因为在隐式模式下,构造函数参数在整个类存在时都存在)

  3. (不太相关)需要使用属性进行方法重载和字段默认设置,而不是放弃。

  4. 无论如何我可以解决这个问题吗?

    *出于性能原因

    编辑:事实证明我对这两点都不对(感谢Ganesh Sittampalam和MichaelGG)。

    1. 虽然我无法在隐式&中使用let inline明确的类定义,我可以使用member inline就好了,我认为它做同样的事情。

    2. 显然使用最新的F#,不再有任何冗余,因为类体中没有使用的任何参数都是构造函数的本地参数。

    3. Will be gone在下一个F#版本中。

2 个答案:

答案 0 :(得分:5)

这可能没有帮助,但您可以使成员内联。 “成员内联私人”工作正常。

答案 1 :(得分:1)

对于let inline,您可以通过将其移到类外部并在调用它时从类的范围内显式传递所需的值来解决它。因为它会被内联,所以这样做不会有性能损失。