在对所有引用超出范围之前,调用System.IDisposable.Dispose对象'emailForm'

时间:2013-06-04 14:25:28

标签: c# .net winforms

我有以下功能:

    private void emailVideoButton_Click(object sender, EventArgs e)
    {
        VideoEMailForm emailForm = new VideoEMailForm();
        emailForm.ShowDialog();
    }

这给了我以下警告:

  

警告1 CA2000:Microsoft.Reliability:在方法中   'VideoPlayerControl.emailVideoButton_Click(object,EventArgs)',调用   System.IDisposable.Dispose在所有引用之前对象'emailForm'   它超出了范围。

我读了这个链接http://msdn.microsoft.com/en-us/library/ms182289(v=vs.80).aspx并收集了我需要调用的内容。像这样说:

    private void emailVideoButton_Click(object sender, EventArgs e)
    {
        VideoEMailForm emailForm = new VideoEMailForm();
        emailForm.ShowDialog();
        emailForm.Dispose();
    }

然后我收到以下警告:

  

警告1 CA2000:Microsoft.Reliability:在方法中   'VideoPlayerControl.emailVideoButton_Click(object,EventArgs)',对象   'emailForm'未在所有异常路径中放置。呼叫   System.IDisposable.Dispose在所有引用之前对象'emailForm'   它超出了范围。

任何人都可以帮我摆脱这个警告吗?

2 个答案:

答案 0 :(得分:12)

编译器试图说的是,如果在emailForm.ShowDialog()中抛出异常,Dispose()将不会被调用。

使用using语句确保以任一方式调用它。

private void emailVideoButton_Click(object sender, EventArgs e)
{
    using (VideoEMailForm emailForm = new VideoEMailForm())
    {
        emailForm.ShowDialog();
    }
}

这相当于这段代码:

private void emailVideoButton_Click(object sender, EventArgs e)
{
    VideoEMailForm emailForm = null;
    try
    {
        emailForm = new VideoEMailForm();
        emailForm.ShowDialog();
    }
    finally
    {
        if (emailForm != null) 
        {
            ((IDisposable)emailForm).Dispose();
        }
    }
}

答案 1 :(得分:4)

您需要using语句,该语句将在Dispose()块中调用finally,以确保即使抛出异常也会处置它。