实例化类型:何时使用new?

And*_*dry 4 .net f# instantiation new-operator

我有一个类型映射f#中的类,如下所示:

type MyClass =
   val myval: integer
   new () = {
      myval = 0;
   }
   member self.MyVal with
      get () = self.myval
Run Code Online (Sandbox Code Playgroud)

好吧,我想创建这个类的实例.我可以这样做:

let myinstance = MyClass ()
Run Code Online (Sandbox Code Playgroud)

要么

let myinstance = new MyClass ()
Run Code Online (Sandbox Code Playgroud)

有什么不同?我可以两个都做吗?

Tom*_*cek 8

从技术上讲,一个区别是你应该new在创建IDisposable对象时使用nyinyithann已经解释过.另一个区别是您可以在创建泛型类型时省略类型参数:

// Works and creates Dictionary<int, string>
let r1 = System.Collections.Generic.Dictionary 10 
r1.Add(10, "A")

// You get a compiler error when you write this:
let r2 = new System.Collections.Generic.Dictionary 10 
r2.Add(10, "A")
Run Code Online (Sandbox Code Playgroud)

除了这两件事之外,没有技术差异(当你写或省略时,生成的IL肯定没有区别new).

你应该在哪个时候使用?这是一种风格问题.任何F#编码标准都没有涵盖这一点,因此这取决于您的偏好.现在我正在考虑它,我自己可能没有非常一致的风格.我认为我通常new在创建要分配给值的实例时使用let:

let rnd = new Random()
Run Code Online (Sandbox Code Playgroud)

但是,我通常不会new在创建要用作参数的对象时使用(例如,Size或者Point在以下示例中):

let frm = new Form(Size = Size(600, 400))
let gr = frm.CreateGraphics()
gr.FillRectangle(Brushes.Red, Rectangle(Point(0, 0), Point(100, 100)))
Run Code Online (Sandbox Code Playgroud)

可能,我也更喜欢使用new更复杂的类型,并避免使用简单类型或.NET值类型(但我不认为我这样做太一致).