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)
你经常使用哪种方式?可读性问题怎么样?
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!!!
它也减少了打字.;-)