CA2000:处置对象警告

时间:2018-02-12 10:54:13

标签: c# warnings dispose fxcop

我有以下方法:

    public byte[] HtmlToDoc(string hmtl, string userId)
    {
        byte[] data;
        var auditor = new ServiceAuditor
        {
            User = userId
        };
        try
        {
            using (var tx = new ServerText())
            {
                tx.Create();
                tx.Load(Server.HtmlDecode(hmtl), StringStreamType.HTMLFormat);
                tx.Save(out data, BinaryStreamType.MSWord);
            }
        }
        catch (Exception e)
        {
            auditor.Errormessage = e.Message + "/n " + e.StackTrace;
            data = new byte[0];
        }
        finally
        {
            auditor.Save();
            auditor.Dispose();
        }
        return data;
    }

我在编译期间收到以下警告:

  

警告CA2000:Microsoft.Reliability:在方法中   ' DocCreator.HtmlToDoc(字符串,字符串)',对象'新的ServiceAuditor()'   并未沿所有异常路径放置。呼叫   System.IDisposable.Dispose on object' new ServiceAuditor()'毕竟   对它的引用超出了范围。

奇怪的是,即使我正在处理这个物体,我也不明白它为什么会抱怨。 你能指出问题在哪里吗?

2 个答案:

答案 0 :(得分:4)

你遇到的问题是这一行:

auditor.Save();

如果抛出异常,则不会运行负责处理auditor对象的下一行。因此,您可以将Save调用包装在另一个try / catch中,但实际上您应该依赖using语句为您执行此操作,因为它隐式调用{ {1}}方法,例如:

Dispose

答案 1 :(得分:0)

感谢@DavidG的回复,肯定在提到的行中有一个错误点,但导致警告的是对象的初始化:

//Add using statement here and wrap it around the rest of the code
using(var auditor = new ServiceAuditor { User = userId })
{
    try
    { ...

应该是:

using(var auditor = new ServiceAuditor())
{
   auditor.User = userId;
    try
    { ...

我在CA2000: Dispose ...

找到了此问题的参考
  

初始化一次性物品的成员不应该在   使用声明的构造函数。