8

我有以下功能:

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

这给了我以下警告:

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

我阅读了此链接http://msdn.microsoft.com/en-us/library/ms182289(v=vs.80).aspx并收集到我需要像这样调用 .Dispose :

    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”并未沿所有异常路径进行处理。在对对象“emailForm”的所有引用超出范围之前调用 System.IDisposable.Dispose。

谁能帮我摆脱这个警告?

4

2 回答 2

22

编译器想说的是,如果抛出异常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();
        }
    }
}
于 2013-06-04T14:27:25.277 回答
4

您需要该using语句,该语句将调用Dispose()一个finally块以确保即使抛出异常也能将其处理掉。

于 2013-06-04T14:26:35.587 回答