繁体   English   中英

是否应该输入一次性物品?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM