Class F#类型何时需要使用new进行初始化?

Class F#类型何时需要使用new进行初始化?,class,f#,constructor,Class,F#,Constructor,给定一个类,例如: type MyClass() = member this.Greet(x) = printfn "Hello %s" x 使用初始化实例是否合适 let x = new MyClass() 或者没有新的 另外,什么时候使用new构造函数比使用提供给类型定义的参数绑定的do更有用?F中的我的模式用于使用new是仅在类型实现IDisposable时才这样做。如果省略了new,编译器将使用这种特殊情况并发出警告 因此,在您的情况下,我不会使用new。但有了以下几点,我会

给定一个类,例如:

type MyClass() =
    member this.Greet(x) = printfn "Hello %s" x
使用初始化实例是否合适

let x = new MyClass()
或者没有新的

另外,什么时候使用
new
构造函数比使用提供给类型定义的参数绑定的
do
更有用?

F中的我的模式用于使用new是仅在类型实现
IDisposable
时才这样做。如果省略了
new
,编译器将使用这种特殊情况并发出警告

因此,在您的情况下,我不会使用
new
。但有了以下几点,我会

type OtherClass() =
  ...
  interface System.IDisposable with 
    member this.Dispose() = ...

let x = new OtherClass()
F#规格:

68 6.5.2对象构造表达式 形式为newty(e1…en)的表达式是对象构造表达式,通常通过调用类型的构造函数方法来构造类型的新实例

14.2.2项目限定查找 对象构造ty(expr)作为对象构造函数调用进行处理,就好像它是由新的ty(expr)编写的一样


如果使用Ty()语法创建实现IDisposable的类型的实例时省略了new关键字,F#编译器将发出警告。Spec没有说明这一事实,但我认为应该明确指出。

我想知道为什么会出现这种情况。使用
use
关键字不是很清楚吗?@ChaosPandion,真的不知道。我相信布赖恩很快就会提供完整的信息history@ChaosPandion:在某些情况下,您不希望使用use绑定创建新的IDisposable,例如您希望它转义创建它的函数。我几乎总是说
new
。我认为如果你有一个与类同名的函数,那么你需要
new
来消除歧义。我不知道这里有什么风格指南。@Brian,为什么F#编译器选择强制执行这个特定的案例?另请参见: