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)
有什么不同?我可以两个都做吗?
从技术上讲,一个区别是你应该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值类型(但我不认为我这样做太一致).
| 归档时间: |
|
| 查看次数: |
397 次 |
| 最近记录: |