我今天正在寻找一个代码审查,其中有人试图通过将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}}还是永远不要清理它。
答案 0 :(得分:0)
SqlXml肯定不应该处理内存流:它是由它的(未知)调用者传递的,它可能会进一步使用它。 SqlXml并不拥有该流,如果它确实处理了它,它可能会破坏调用者,因此在将它放在需要它之后它应该单独留下。