我应该使用新的Type()还是只使用Type()来调用构造函数

Str*_*ger 14 f# constructor coding-style

两种语法都是等价的(至少我认为它们是相同的).

let o1 = new Object()
Run Code Online (Sandbox Code Playgroud)

要么

let o2 = Object()
Run Code Online (Sandbox Code Playgroud)

你经常使用哪种方式?可读性问题怎么样?

kvb*_*kvb 18

我觉得省略"新"有点功能,所以这是我的偏好.我喜欢你可以像处理返回类型实例的任何其他函数一样对待构造函数.


Bri*_*ian 11

他们是一样的.

我更喜欢使用'new',除了它是我在其他语言中习以为常的原因之外没什么好理由,它使得findtr/grep更容易用于构造函数调用(缺少智能工具来"在解决方案中找到所有引用") .


luk*_*san 11

我是kvb说的第二个.另外,我省略了new因为这允许我直接在构造的对象上调用成员,就像在C#中一样.例如,以下代码有效:

DateTime(2012, 12, 21).ToString()
Run Code Online (Sandbox Code Playgroud)

以下代码不起作用并导致编译器错误:

new DateTime(2012, 12, 21).ToString()
Run Code Online (Sandbox Code Playgroud)

所以现在我需要将表达式括new起来以使其编译:

(new DateTime(2012, 12, 21)).ToString()
Run Code Online (Sandbox Code Playgroud)

我不喜欢额外的括号,所以我new现在避免使用.

我仍然会使用它的一种情况是当我创建一个实现的对象时IDisposable.这是因为如果我new在创建IDisposableF#编译器时省略了关键字,则会发出警告:

let writeFile =
    let writer = StreamWriter(@"hello.txt")
    writer.WriteLine("hello")
Run Code Online (Sandbox Code Playgroud)

结果如下:

警告FS0760:建议使用"new Type(args)"而不是"Type(args)"创建支持IDisposable接口的对象,以指示资源可能由生成的值拥有

我可以通过添加new关键字来消除警告:

let writeFile =
    let writer = new StreamWriter("hello.txt")
    writer.WriteLine("hello")
Run Code Online (Sandbox Code Playgroud)

警告也让我意识到我应该use对我有一个约束力IDisposable:

let writeFile =
    use writer = new StreamWriter("hello.txt")
    writer.WriteLine("hello")
Run Code Online (Sandbox Code Playgroud)

但是,如果我编写我的代码以便一直使用new ,那么我永远不会收到警告,提醒我我正在使用IDisposable!!!

它也减少了打字.;-)