2012-05-14 46 views
14

在代碼審查中,同事將我的代碼更改爲傳入Stream作爲參數。他說這是爲了確保處理該對象的責任對於調用者來說是清楚的。從某種意義上說,我可以同情。我希望對象創建者也負責清理。應該丟棄一次性物品嗎?

另一方面,這兩種方法都不需要更清晰的using。我更喜歡簡單的方法調用。

採取

public static TextReader Serialize<T>(T obj) where T: new() 
    { 
     if (obj == null) throw new ArgumentNullException("obj"); 
     return Serialize<T>(obj, null); 
    } 

VS

public static void Serialize<T>(T obj, TextWriter outbound) where T : new() 
    { 
     if (obj == null) throw new ArgumentNullException("obj"); 
     Serialize<T>(obj, outbound, null); 
    } 

是否有任何技術原因添加額外的PARAM?

+3

如果我們從.NET Framework本身獲取一個提示,例如「XmlSerializer」,則該流往往會作爲參數傳入。 – mellamokb

+0

可能是http://codereview.stackexchange.com/的問題 – MattDavey

回答

9

它嚴格依賴於您的代碼架構。

我個人而言,像第二種方法(即使它增添了一個論點),其中函數的定義狀態它不會關閉/處分流,但它是由主叫方。

當你打算在同一個流上調用相同的函數時,這會非常有用,因爲如果你想象的那樣,每個函數調用都會關閉並重新打開流,那麼這會變成資源消耗操作。

4

您可能已經打開了TextWriter。這就是爲什麼我更喜歡第二個版本。此外,它減少了Serialize方法的作用範圍:它序列化,但它不打開任何東西。開幕是一個不同的問題。

0

重載的Serialize-T方法創建流?如果是這樣的話,我更喜歡#1監守它使「用」簡單:

using (var stream = Serialize(a_T))) 
{ 
    // Do something else with the stream? 
} 

在另一方面,它可能是調用者更好的供應流,在這種情況下,你想傳遞一個在拉選項2.

1

隨着項目的發展,程序員維護第一個方法中的代碼可能不記得調用代碼負責關閉流(特別是在非平凡的情況下) 。呼叫者必須依靠文件來做正確的事情,每個人都閱讀文件,對吧? ;)

接近更好"balances" resources。它使責任分離的地方更加清楚。