2013-06-04 23 views
5

tôi có chức năng sau:Gọi System.IDisposable.Dispose trên đối tượng 'emailForm' trước khi tất cả các tài liệu tham khảo để nó nằm ngoài phạm vi

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

nào mang lại cho tôi những cảnh báo sau đây:

Cảnh báo 1 CA2000: Microsoft.Reliability: Trong phương thức 'VideoPlayerControl.emailVideoButton_Click (đối tượng, EventArgs)', hãy gọi System.IDisposable.Dispose trên đối tượng 'emailForm' trước khi tất cả các tham chiếu để nó nằm ngoài phạm vi.

tôi đọc liên kết này http://msdn.microsoft.com/en-us/library/ms182289(v=vs.80).aspx và thu thập được rằng tôi cần phải gọi .Dispose như vậy:

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

Nhưng sau đó tôi nhận được cảnh báo sau đây:

Cảnh báo 1 CA2000: Microsoft. Độ tin cậy: Trong phương thức 'VideoPlayerControl.emailVideoButton_Click (đối tượng, EventArgs)', đối tượng 'emailForm' không được xử lý dọc theo tất cả các đường dẫn ngoại lệ. Gọi System.IDisposable.Dispose trên đối tượng 'emailForm' trước khi tất cả các tham chiếu đến nó nằm ngoài phạm vi.

Có ai có thể giúp tôi loại bỏ cảnh báo này không?

Trả lời

12

Trình biên dịch đang cố gắng nói là nếu ngoại lệ được ném trong emailForm.ShowDialog(), Dispose() sẽ không được gọi.

Sử dụng tuyên bố using để đảm bảo rằng nó sẽ được gọi theo một trong hai cách.

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

này tương đương với mã này:

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

Vì vậy, tôi không phải tự gọi .Dispose sau đó khi tôi sử dụng phương pháp này ???? –

+1

Đúng vậy. Trình biên dịch sẽ thêm lệnh gọi 'Dispose' cho bạn. – Rotem

+1

mã thứ hai trong ví dụ của bạn có thực sự hoạt động không? khi tôi làm điều này tôi nhận được một tên không tồn tại trong bối cảnh hiện tại lỗi. – Bastardo

4

Bạn cần tuyên bố using, sẽ gọi Dispose() trong khối finally để đảm bảo nó được xử lý ngay cả khi ngoại lệ được ném.

Các vấn đề liên quan