在代码审查中,同事更改了我的代码以将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);
}
是否有任何技术原因可以添加额外的参数?
答案 0 :(得分:9)
它严格依赖于您的代码架构。
我个人而言,就像第二种方法(即使它再添加一个参数),定义 状态它不会关闭/处理流,但这取决于来电者。
如果您要在同一个流上调用相同的函数,这非常有用,如果您想象,每个函数调用将关闭并重新打开流,它将成为资源消耗操作。
答案 1 :(得分:4)
您可能已经打开了TextWriter。这就是为什么我更喜欢第二个版本。此外,它减少了Serialize方法的作用范围:它序列化,但它不会打开任何东西。开放是一个不同的问题。
答案 2 :(得分:1)
随着项目的发展,程序员在第一个方法中维护代码可能不记得调用代码是关闭流的责任(特别是在非平凡的情况下)。调用者必须依靠文档来做正确的事情并且每个人都阅读文档,对吗? ;)
第二方法更好"balances" resources。它使责任分离的地方更加清晰。
答案 3 :(得分:0)
重载的Serialize-T方法创建流吗?如果是这种情况,我更喜欢#1因为它使'使用'更简单:
using (var stream = Serialize(a_T)))
{
// Do something else with the stream?
}
另一方面,调用者可能更好地提供流,在这种情况下,您希望在la选项2中传递一个。