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

14

这两种语法是等效的(至少我认为是这样)。

let o1 = new Object()
或者
let o2 = Object()

你更经常使用哪种方式?可读性问题如何?

3个回答

18

我觉得省略 "new" 更加实用,所以这是我的首选。我喜欢你可以像处理其他函数一样处理构造函数并返回一个类型的实例。


也许这样做是有道理的。我认为重要的是做出选择,然后遵循它。 - elmattic

13

我支持kvb所说的。此外,我省略了new 因为这样允许我直接在构造对象上调用成员,就像在C#中一样。例如,下面的代码可以正常工作:

DateTime(2012, 12, 21).ToString()
以下代码无法正常工作并导致编译器错误:
new DateTime(2012, 12, 21).ToString()

那么现在我需要在new表达式中添加括号才能使其编译通过:

(new DateTime(2012, 12, 21)).ToString()

我不喜欢多余的括号,所以现在避免使用 new

唯一一个例外情况是当我创建实现 IDisposable 接口的对象时。这是因为如果我在创建 IDisposable 时省略了 new 关键字,F# 编译器会发出警告:

let writeFile =
    let writer = StreamWriter(@"hello.txt")
    writer.WriteLine("hello")

结果如下:

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

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

let writeFile =
    let writer = new StreamWriter("hello.txt")
    writer.WriteLine("hello")

这个警告也让我意识到,我应该为我的 IDisposable 建立一个 use 绑定:

let writeFile =
    use writer = new StreamWriter("hello.txt")
    writer.WriteLine("hello")

但是如果我总是使用new,那么我永远不会得到警告,提醒我正在使用IDisposable!!!

这也可以减少打字。 ;-)


非常合乎逻辑的推理,解释了为什么不应该经常使用 new,而只在必要时使用 use。对括号进行深思熟虑可以产生干净的代码。 - bugfoot

11

它们是相同的。

我更喜欢使用'new',虽然没有什么好理由,只是因为在其他语言中我习惯用这个词,而且它使得在构造函数调用中查找str/grep变得更容易(缺少智能工具来在解决方案中“查找所有引用”)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接