【问题标题】:Is there a benefit to storing an object in a variable before calling a method on it?在调用方法之前将对象存储在变量中是否有好处?
【发布时间】:2010-06-18 20:47:37
【问题描述】:

示例 1:

SomeObject someObject = new SomeObject();
if (someObject.Method())
{
    //do stuff
}
//someObject is never used again

示例 2:

if (new SomeObject().Method())
{
    //do stuff
}

使用第一种方法比使用第二种方法有什么好处吗?反之亦然?

【问题讨论】:

    标签: c# constructor instantiation method-chaining


    【解决方案1】:

    至少有三个潜在的好处:

    1. 可读性:在许多情况下,第一个示例比第二个示例的语法更明显,尤其是对于新开发人员而言。

    2. 更好的调试体验:如果SomeObject 的构造函数抛出异常,在第一种情况下,调试器将在该行中断。在第二种情况下,异常是在构造函数中还是在方法中并不明显。在对象上设置断点和检查值也会出现同样的问题 - 这在第二种情况下会很困难,并且需要在方法内部设置断点。

    3. 在第一种情况下,您可以在单个调用之外使用对象。如果你真的只需要一次调用的方法,而不需要对象引用,那么静态方法可能更合适。

    【讨论】:

      【解决方案2】:

      在大多数微不足道的情况下,编译器无论如何都会删除它。值类型有一点很重要,就是将其复制到变量中会克隆值,因此可以表示重大变化 - 但无论如何您都不应该鼓励可变值类型。

      对于浮点,在某些极端情况下,当它使用本地时,您会得到不同的答案(本机类型的宽度大于 Single / Double 等) - 这也意味着您可以获得不同的结果带调试/释放(取决于变量是否被编译器删除)。

      在某些情况下,变量可以做的不仅仅是堆栈上的值 - 即被“捕获”到 lambda / anon 方法中,或者用于out/ref,但这很少适用。

      【讨论】:

        【解决方案3】:

        在调试以查看值时可能很有用(如果对象是 COM 互操作或类似的东西,您需要处理它可能很重要,保留引用以便您能够这样做以受控方式)。

        如果名称很长或者有多层嵌套,它也更容易阅读。

        【讨论】:

          【解决方案4】:

          我倾向于第一个选项以提高可读性,例如:

          var phoneNumberRx = new Regex(@"^\(\d{3}\)\d{3}-\d{4}$");
          

          【讨论】:

            猜你喜欢
            • 2012-05-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-23
            • 2020-03-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多