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 に答える