我希望今天做一个代码审查,有人试图通过将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什么时候会被密封,所以我可以实际地扩展它。
有谁能建议一个好的方法来处理这个问题吗?我计划在微软的某个地方记录一个bug,因为这不是一件很好的事情。
我目前最好的建议是使用接受XmlReader的构造函数,因为它至少复制了内容,这样读取器就可以被释放了--然而在内部,它只会创建一个MemoryStream,而不会清理它。
发布于 2015-08-04 00:11:00
SqlXml当然不应该处理内存流:它是由它的(未知的)调用者传递的,而调用者很可能会进一步使用它。SqlXml并不拥有流,如果它确实处理了流,那么它很可能会破坏调用方,所以在将它放在需要的地方之后,它应该不会去管它。
https://stackoverflow.com/questions/31791340
复制相似问题