2012-02-09 29 views
-2

我对我们的工具跑了静态代码分析工具,并查看其结果下面的代码是它在谈论一件事:哪些代码写得更好?

SpreadSnapshot oSnap = new SpreadSnapshot(); 
    using (oSnap.SetRowCol(fpSpread, row, col)) 
    { 
     SpreadSetComboBox(fpSpread, list, displayProperty); 
    } 

所以我把它改成下面的代码,并将其固定的错误该工具正在谈论:

using (SpreadSnapshot oSnap = new SpreadSnapshot()) 
    { 
     oSnap.SetRowCol(fpSpread, row, col); 
     SpreadSetComboBox(fpSpread, list, displayProperty); 
    } 

因此,您认为您认为哪种编码风格更合适,更不容易出错?

感谢

+2

[codereview.se]存在这样的问题。 – 2012-02-09 21:31:49

+0

只是它说的是什么错误? – 2012-02-09 21:31:56

+0

@KyleTrauberman:这个500K代码已经通过一些工具从VB 6.0转换到了C#,我们无法再次编写代码审查所有代码,因此我们正在重构像这样的代码。 – Bohn 2012-02-09 21:33:41

回答

4

这两者意味着完全不同的东西,除非SetRowCol最后返回this。首先,你正在处理SetRowCol的结果。第二,你正在处置SpreadSnapshot

如果两个都是一次性的,你应该做一个使用两个:

using (SpreadSnapshot oSnap = new SpreadSnapshot()) 
using (oSnap.SetRowCol(fpSpread, row, col)) 
{ 
    SpreadSetComboBox(fpSpread, list, displayProperty); 
} 
+0

正确,它返回“this”,所以第一个代码仍然是正确的。对? – Bohn 2012-02-09 22:13:06

6

后者 - 它可以确保你最终不会使用oSnapusing语句之后。

除了其他任何事情,SetRowCol返回一次性物品都会很奇怪......那甚至意味着什么?

+0

我使用using语句时,我正在做linq-to-sql(使用DataContext的....)。使用using语句和实例化对象有什么区别? – frenchie 2012-02-09 21:35:27

+0

@frenchie:这是一个太大的问题,不容易在评论中回答,但它应该在任何良好的C#入门书中介绍。我*强烈*建议您在继续之前阅读使用说明... – 2012-02-09 21:38:33

+0

@JonSkeet:感谢Jon,第一种编码风格是否也会导致内存泄漏? – Bohn 2012-02-09 21:40:49