首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SqlXml不承担处置MemoryStream的责任

SqlXml不承担处置MemoryStream的责任
EN

Stack Overflow用户
提问于 2015-08-03 23:36:01
回答 1查看 121关注 0票数 0

我希望今天做一个代码审查,有人试图通过将MemoryStream包装在using块中来处理它。在本例中,它被传递到一个SqlXml实例中,而我不确定它对它做了什么,所以我快速查看了反编译的源代码。示例代码如下:

代码语言:javascript
复制
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;

以下是反编译的源代码:

代码语言:javascript
复制
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,而不会清理它。

EN

回答 1

Stack Overflow用户

发布于 2015-08-04 00:11:00

SqlXml当然不应该处理内存流:它是由它的(未知的)调用者传递的,而调用者很可能会进一步使用它。SqlXml并不拥有流,如果它确实处理了流,那么它很可能会破坏调用方,所以在将它放在需要的地方之后,它应该不会去管它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31791340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档