【问题标题】:Should I use new Type() or just Type() for calling a constructor我应该使用 new Type() 还是只使用 Type() 来调用构造函数
【发布时间】:2009-12-01 23:24:55
【问题描述】:

两种语法是等价的(至少我认为它们是等价的)。

let o1 = new Object()

或

let o2 = Object()

您更经常使用哪种方式?可读性问题呢?

【问题讨论】:

    标签: f# coding-style constructor


    【解决方案1】:

    我觉得省略“新”更实用,所以这是我的偏好。我喜欢你可以像对待任何其他返回类型实例的函数一样对待构造函数。

    【讨论】:

    • 也会有道理.. 我认为重要的是做出选择然后顺从它。
    【解决方案2】:

    我赞同 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")
    

    结果如下:

    警告 FS0760:建议支持 IDisposable 接口是使用 'new Type(args)' 而不是 '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。仔细考虑括号会产生干净的代码。
    【解决方案3】:

    它们是一样的。

    我更喜欢使用“new”,除了我在其他语言中习惯使用它之外没有什么充分的理由,而且它使查找构造函数调用的 str/grep 变得更容易(缺乏智能工具来“查找所有引用”)解决方案)。

    【讨论】:

      猜你喜欢
      • 2016-02-20
      • 2017-01-26
      • 2014-03-21
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 2011-07-08
      相关资源
      最近更新 更多