物体可以被处置多次-最佳解决方案

cb_dev

我在以下代码中收到警告CA2202(对象可能被处置多次):

using (Stream responseStream = response.GetResponseStream())
{
    if (responseStream != null)
        using (var br = new BinaryReader(responseStream))
        {
            responseValue = br.ReadBytes(500000);
        }
}

似乎在调用BinaryReaders Dispose时调用了responseStreams Dispose。BinaryReader是否总是调用Streams Dispose方法?

一种解决方案是直接初始化ResponseStream并让BinaryReader小心处理流(当然,只有在任何情况下BinaryReader都可以处理流的情况下,这种方法才有效)

Stream responseStream = response.GetResponseStream();
if(responseStream != null)
    using (var br = new BinaryReader(responseStream)) //Always disposes the response stream?
        [...]

我可以使用try / finalize而不是外部using语句来获得如下内容:

Stream responseStream = null;
try
{
    responseStream = response.GetResponseStream();
    if (responseStream != null)
        using (var br = new BinaryReader(responseStream))
        {
            responseValue = br.ReadBytes(500000);
        }
}
finally
{
    if(stream != null)
        stream.Dispose;
}

当BinaryReader总是处理流时,这看起来不好看,没有必要。是否有更好/首选的解决方案来解决此类问题?

马辛·侏罗纪

您实际上可以看一下如何BinaryReader.Dispose实现:

protected virtual void Dispose(bool disposing) {
    if (disposing) {
        Stream copyOfStream = m_stream;
        m_stream = null;
        if (copyOfStream != null && !m_leaveOpen)
            copyOfStream.Close();
    }
    m_stream = null;
    m_buffer = null;
    m_decoder = null;
    m_charBytes = null;
    m_singleChar = null;
    m_charBuffer = null;
}

public void Dispose()
{
    Dispose(true);
}

现在,问题是什么m_leaveOpen这是一个标志,指示是否应处置基础流!默认情况下设置为false,这意味着将处理基础流:

public BinaryReader(Stream input) : this(input, new UTF8Encoding(), false) {
}

public BinaryReader(Stream input, Encoding encoding) : this(input, encoding, false) {
}

public BinaryReader(Stream input, Encoding encoding, bool leaveOpen) {
    // (...)
    m_leaveOpen = leaveOpen;
    // (...)
}

因此,您可以跳过using流周围的语句,因为它仍然会被处理:

responseStream = response.GetResponseStream();
if (responseStream != null)
{
    using (var br = new BinaryReader(responseStream))
    {
        responseValue = br.ReadBytes(500000);
    }
}

要不就

using (var br = new BinaryReader(response.GetResponseStream()))
{
    responseValue = br.ReadBytes(500000);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

物体可以被处置多次-最佳解决方案

来自分类Dev

“名人”算法的最佳解决方案

来自分类Dev

WebSocket:后端的最佳解决方案

来自分类Dev

尝试最佳解决方案?

来自分类Dev

字谜检查的最佳解决方案?

来自分类Dev

背包最佳解决方案(蛮力)

来自分类Dev

寻找最佳解决方案

来自分类Dev

忽略maxLength的最佳解决方案

来自分类Dev

级联IF语句-最佳解决方案

来自分类Dev

XSRF / CSRF安全REST呼叫的最佳解决方案?

来自分类Dev

jQuery“窗帘”功能-最佳解决方案?

来自分类Dev

托管搜寻器的最佳解决方案?

来自分类Dev

网页中水平对齐的最佳解决方案?

来自分类Dev

最大单笔销售利润算法的最佳解决方案

来自分类Dev

使用nloptr查找N个最佳解决方案

来自分类Dev

爱丽丝·鲍勃硬币的最佳解决方案

来自分类Dev

在iCloud上保存游戏进度:最佳解决方案?

来自分类Dev

在HaxeFlixel中编码资产的最佳解决方案

来自分类Dev

多线程网络刮板的最佳解决方案?

来自分类Dev

插入时需要mysql事件的最佳解决方案?

来自分类Dev

Android REST客户端:最佳解决方案?

来自分类Dev

找出最佳解决方案的数据结构

来自分类Dev

iOS 9解析JSON的最佳解决方案

来自分类Dev

控制访问StrongLoop中模型的最佳解决方案

来自分类Dev

解锁网络音频的最佳解决方案

来自分类Dev

流程树问题的最佳解决方案

来自分类Dev

在Elasticsearch中更改设置的最佳解决方案

来自分类Dev

DDD删除聚合的最佳解决方案

来自分类Dev

JavaFX:Stage in Controller-最佳解决方案