一次性物品是否应传入

本文关键字:是否 一次性 | 更新日期: 2023-09-27 18:34:12

在代码审查中,一位同事更改了我的代码,将 Stream 作为参数传入。 他说,这是为了确保调用者清楚处置物品的责任。 从某种意义上说,我可以感同身受。 我希望对象创建者也负责清理。

另一方面,这两种方法都没有使using的必要性更加明确。 我也更喜欢更简单的方法调用。

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

    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?
} 

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