只读与自动(只读)属性

Dan*_*iel 6 f# f#-3.0

使用只读属性之间有区别吗:

type T(arg) =
  member x.M = arg
Run Code Online (Sandbox Code Playgroud)

并使用自动实现的属性:

type T(arg) =
  member val M = arg
Run Code Online (Sandbox Code Playgroud)

假设arg没有副作用?有理由偏爱一个吗?

byt*_*ter 10

它们之间的本质区别在于member val表示在实例初始化期间计算一次的表达式.因此,

type Person(fname, lname) =
  member val Name = fname + lname // would be calculated once
Run Code Online (Sandbox Code Playgroud)

因此,首先考虑的是性能.

另一个考虑因素是基于自动属性的两个限制:

  • 你只能在主ctor的类型中使用它们;
  • 他们不可能 virtual

  • 我更喜欢没有`this`引用的自动语法.它清楚地表明它既不会改变对象,也不会依赖于其他成员. (3认同)