C# 一次性物品是否应该传入?

C# 一次性物品是否应该传入?,c#,C#,在代码复查中,一位同事将我的代码更改为作为参数传入流。他说,这是为了确保打电话的人清楚地知道处置物品的责任。从某种意义上说,我能感同身受。我更希望对象创建者也负责清理 另一方面,这两种方法都没有使使用的的必要性更加明确。我更喜欢更简单的方法调用 接受 公共静态文本读取器序列化(T obj),其中T:new() { 如果(obj==null)抛出新的ArgumentNullException(“obj”); 返回序列化(obj,null); } VS publicstaticvoid序列化(T

在代码复查中,一位同事将我的代码更改为作为参数传入流。他说,这是为了确保打电话的人清楚地知道处置物品的责任。从某种意义上说,我能感同身受。我更希望对象创建者也负责清理

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

接受

公共静态文本读取器序列化(T obj),其中T:new()
{
如果(obj==null)抛出新的ArgumentNullException(“obj”);
返回序列化(obj,null);
}
VS

publicstaticvoid序列化(T obj,TextWriter出站),其中T:new()
{
如果(obj==null)抛出新的ArgumentNullException(“obj”);
序列化(对象、出站、空);
}

添加额外参数有什么技术原因吗?

这完全取决于您的代码体系结构

一、 就个人而言,就像第二种方法(即使它增加了一个参数)一样,函数的定义声明它不会关闭/处理流,但这取决于调用方


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

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

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

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

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

随着项目的发展,以优先方法维护代码的程序员可能不记得关闭流是调用代码的责任(特别是在非常重要的情况下)。呼叫者必须依靠文档来做正确的事情,并且每个人都阅读文档,对吗?;)


第二种方法更好。它使职责分离的位置更加清晰。

如果我们从.NET框架本身得到一个线索,例如,
XmlSerializer
,则流倾向于作为参数传入。这可能是一个问题
    public static void Serialize<T>(T obj, TextWriter outbound) where T : new()
    {
        if (obj == null) throw new ArgumentNullException("obj");
        Serialize<T>(obj, outbound, null);
    }
using (var stream = Serialize(a_T)))
{
    // Do something else with the stream?
}