[英]Should disposable objects be passed in?
在代碼審查中,同事更改了我的代碼以將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);
}
是否有任何技術原因可以添加額外的參數?
它嚴格依賴於您的代碼架構。
我個人喜歡第二種方法(即使它增添了一個論點),其中函數的定義 指出它不會關閉/處分流,但它是由主叫方。
當您要在同一個流上調用相同的函數時,這非常有用,如果您想象,每個函數調用將關閉並重新打開流,它將成為資源消耗操作。
您可能已經打開了TextWriter。 這就是為什么我更喜歡第二個版本。 此外,它減少了Serialize方法的作用范圍:它序列化,但它不會打開任何東西。 開放是一個不同的問題。
隨着項目的發展,在第一種方法中維護代碼的程序員可能不記得調用代碼是關閉流的責任(特別是在非平凡的情況下)。 調用者必須依靠文檔來做正確的事情並且每個人都閱讀文檔,對嗎? ;)
第二種方法更好地“平衡”資源 。 它使責任分離的地方更加清晰。
重載的Serialize-T方法創建流? 如果是這種情況我更喜歡#1因為它使'使用'更簡單:
using (var stream = Serialize(a_T)))
{
// Do something else with the stream?
}
另一方面,調用者可能更好地提供流,在這種情況下,您希望在la選項2中傳遞一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.