2012-02-09 60 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