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);
    }

添加额外参数是否有任何技术原因?

4

4 回答 4

9

这完全取决于您的代码架构。

我个人喜欢第二种方法(即使它增加了一个参数),其中函数的定义表明它不会关闭/处理流,但这取决于调用者。

当您要在同一个流上调用相同的函数时,这非常有用,因为如果您想象每个函数调用都会关闭并重新打开流,它会成为资源消耗操作。

于 2012-05-14T19:58:54.663 回答
4

您可能已经打开了一个 TextWriter。这就是为什么我更喜欢第二个版本。此外,它还缩小了 Serialize 方法的作用范围:它序列化了,但它不打开任何东西。打开是一个不同的问题。

于 2012-05-14T19:59:06.223 回答
1

随着项目的发展,在第一种方法中维护代码的程序员可能不记得关闭流是调用代码的责任(尤其是在不平凡的情况下)。调用者必须依靠文档来做正确的事情,每个人都阅读文档,对吗?;)

第二种方法更好地“平衡”资源。它使责任分离的位置更加清晰。

于 2012-05-14T20:11:45.977 回答
0

重载的 Serialize-T 方法创建流?如果是这种情况,我更喜欢#1,因为它使“使用”更简单:

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

另一方面,调用者提供流可能会更好,在这种情况下,您希望在选项 2 中传递一个。

于 2012-05-14T20:01:37.857 回答