在调用方法之前将对象存储在变量中是否有好处?

时间:2010-06-18 20:47:38

标签: c# constructor instantiation method-chaining

示例1:

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

VS

示例2:

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

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

4 个答案:

答案 0 :(得分:12)

至少有三个潜在的好处:

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

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

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

答案 1 :(得分:3)

在大多数琐碎的情况下,编译器无论如何都会删除它。值类型有一个重点,即将其复制到变量中会克隆该值,因此可以表示重大更改 - 但不管怎样,您不应该鼓励可变的值类型。

对于浮点数,有一些边缘情况,当它使用本地时,你得到不同的答案(原生类型的宽度大于Single / Double等) - 这也意味着你可以通过调试/发布获得不同的结果(取决于编译器是否删除了变量)。

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

答案 2 :(得分:2)

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

如果名称很长或者有多个嵌套级别,它也可以更容易阅读。

答案 3 :(得分:0)

我赞成提高可读性的第一个选项,例如:

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