SqlXml不负责处理MemoryStream

时间:2015-08-03 15:36:01

标签: c# dispose idisposable

我今天正在寻找一个代码审查,其中有人试图通过将MemoryStream封装在using块中来处置SqlXml。在这种情况下,它被传递到一个using(MemoryStream ms = new MemoryStream(data)) { var param = new SqlXml(ms); var parameter = new SqlParameter("@Xml", System.Data.SqlDbType.Xml) { Value = param }; command.Parameters.Add(parameter); } return command; 实例,我不知道它用它做了什么,所以我快速查看了反编译源。这是示例代码:

public SqlXml(Stream value)
{
    if (value == null)
    {
        this.SetNull();
    }
    else
    {
        this.firstCreateReader = true;
        this.m_fNotNull = true;
        this.m_stream = value;
    }
}

以下是经过反编译的来源:

SqlXml

现在最佳做法是IDisposable现在应该负责处理此流。但不幸的是,它没有实现SqlCommand

除此之外,我不知道包含它的SqlXml什么时候会被消耗,XmlReader被封存,所以我可以实际地扩展它。

有人能建议一个好方法来处理这个吗?我打算在微软的某个地方记录一个bug,因为要解决这个问题并不是一件好事。

我目前最好的建议是使用带有MemoryStream的构造函数,因为它至少会复制内容,因此可以处理读者 - 无论是内部创建{{1}}还是永远不要清理它。

1 个答案:

答案 0 :(得分:0)

SqlXml肯定不应该处理内存流:它是由它的(未知)调用者传递的,它可能会进一步使用它。 SqlXml并不拥有该流,如果它确实处​​理了它,它可能会破坏调用者,因此在将它放在需要它之后它应该单独留下。