首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流写入器CA2202:不要多次释放对象

流写入器CA2202:不要多次释放对象
EN

Stack Overflow用户
提问于 2018-10-04 15:56:35
回答 1查看 264关注 0票数 0

我在调试时使用一段代码将一行信息写入文件。

代码语言:javascript
复制
    private bool appendLine(string line2Write, string fileName)
    {
        try
        {
            StreamWriter tw;
            using (tw = File.AppendText(fileName))
            {
                tw.WriteLine(line2Write);
                tw.Close();
            }
        }
        catch (Exception ex)
        {
            DialogResult result = MessageBox.Show("Unable to write to: " + fileName + "\r\n" + ex.ToString() + "\r\n OK to retry", "File Sysytem Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
            if (result == DialogResult.Cancel)
            {
                return false;
            }
        }
        return true;
    }

我不想让文件打开,因为如果它是调试信息,我不想冒险最后一点,如果程序崩溃。

我可能不明白CA2202在告诉我什么。

下面是整个错误声明:

警告CA2202对象'tw‘可以在方法'familyFinances.appendLine(string,string)’中多次释放。为了避免生成System.ObjectDisposedException,您不应该对对象调用Dispose超过一次。

"tw“只存在于此代码中。而且,我从来没有用这种方式运行过错误。

选择还是建议?

EN

回答 1

Stack Overflow用户

发布于 2018-10-04 17:35:59

正如其他人已经提到的,造成此问题是因为您正在using块中调用using,应该删除该调用。我建议你挖掘并理解为什么这些电话是等价的。

查看StreamWriter.Close()源代码:

代码语言:javascript
复制
public override void Close() {
   Dispose(true);
   GC.SuppressFinalize(this);
}

以及IDisposable.Dispose()方法,TextWriter (BaseforStreamWriter)实现如下。当关闭Dispose()块的大括号时,运行时会调用该using

代码语言:javascript
复制
public void Dispose() {
    Dispose(true);
    GC.SuppressFinalize(this);
}

编译器将using块转换为try/finally,因此所讨论的代码相当于:

代码语言:javascript
复制
StreamWriter tw = File.AppendText(fileName)
try {
    tw.WriteLine(line2Write);
    tw.Close();
}
finally {
    tw.Dispose();
}

所以你做了两次同样的事情,从而得到了警告。

FYI - .NET框架源代码这里

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

https://stackoverflow.com/questions/52650963

复制
相关文章

相似问题

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