C # Form.Close so với Form.Dispose


88

Tôi mới làm quen với C # và tôi đã cố gắng xem các bài viết trước đó nhưng không tìm thấy câu trả lời hay.

Trong Ứng dụng Biểu mẫu Windows C # với một biểu mẫu duy nhất, sử dụng Form.Close()tốt hơn hay Form.Dispose()?

MSDN nói rằng tất cả các tài nguyên bên trong đối tượng đều bị đóng và biểu mẫu được xử lý khi một Đóng được gọi. Mặc dù vậy, tôi đã xem qua một số ví dụ trực tuyến theo kiểu Vứt bỏ chứ không phải là Đóng.

Cái này có lợi thế hơn cái kia không? Theo tình huống nào, chúng ta nên thích cái này hơn cái kia?


Câu hỏi hơi khác nhau, cùng một câu trả lời, IMO: tức là Đóng và Loại bỏ thường tương đương nhau, ngoại trừ việc bạn có thể gọi Đóng nhiều lần.
ChrisW

2
@Chrisw: Bạn cũng có thể gọi Dispose nhiều lần.
Henk Holterman

@ChrisW, Dispose cũng nên được thiết kế để chạy nhiều lần. bluebytesoftware.com/blog/…
Steven Evers

Điều khiến tôi đóng lại === vứt bỏ chứ không phải đóng == form.Vible = false; Tôi đã hy vọng rằng đóng cửa sẽ là một phương pháp nhẹ nhàng hơn là vứt bỏ.
Pete Kirkham

4
@Pete Kirkham: Nếu bạn muốn, form.Visible = false;bạn có thể gọi form.Hide(). Trong thực tế, form.Hide()chỉ đơn giản là đặt this.Visible = false;.
Dirk Vollmar

Câu trả lời:


171

Diễn đàn này trên MSDN cho bạn biết.

Form.Close()gửi thông báo Windows thích hợp để tắt cửa sổ win32. Trong quá trình đó, nếu biểu mẫu không được hiển thị theo phương thức, thì Loại bỏ được gọi trên biểu mẫu. Việc hủy bỏ biểu mẫu sẽ giải phóng các tài nguyên không được quản lý mà biểu mẫu đang nắm giữ.

Nếu bạn làm một form1.Show()hoặc Application.Run(new Form1()), Vứt bỏ sẽ được gọi khi Close()được gọi.

Tuy nhiên, nếu bạn form1.ShowDialog() hiển thị biểu mẫu theo cách thức, biểu mẫu sẽ không được xử lý và bạn sẽ cần phải gọi form1.Dispose()cho chính mình. Tôi tin rằng đây là lần duy nhất bạn nên lo lắng về việc tự xử lý hình thức.


Phiên bản đầu tiên có bao gồm câu trích dẫn không? +1 để bù đắp.
Henk Holterman

@ Dan phiên bản đầu tiên hút ... (Xin lỗi @Kyra)
jjnguy

13
Điều này có phần không giống với trạng thái MSDN tại msdn.microsoft.com/en-us/library/… : "Một điều kiện khi biểu mẫu không được xử lý trên Đóng là khi nó là một phần của giao diện nhiều tài liệu (MDI) ứng dụng và biểu mẫu không hiển thị. Trong trường hợp này, bạn sẽ cần gọi Vứt bỏ theo cách thủ công để đánh dấu tất cả các điều khiển của biểu mẫu để thu gom rác. " Tuy nhiên, cần dễ dàng kiểm tra xem các mẫu đơn có được xử lý hay không bằng một mẫu đơn giản.
Dirk Vollmar


14

Theo nguyên tắc chung, tôi luôn ủng hộ việc gọi phương thức Dispose một cách rõ ràng cho bất kỳ lớp nào cung cấp nó, bằng cách gọi phương thức trực tiếp hoặc gói trong một khối "using".

Thông thường, các lớp triển khai IDisposible làm như vậy vì chúng bao bọc một số tài nguyên không được quản lý cần được giải phóng. Trong khi các lớp này nên có các trình hoàn thiện hoạt động như một biện pháp bảo vệ, việc gọi Dispose sẽ giúp giải phóng bộ nhớ đó sớm hơn và với chi phí thấp hơn.

Trong trường hợp của đối tượng Biểu mẫu, như liên kết mà Kyra đã lưu ý, phương thức Đóng được ghi lại để gọi Dispose thay mặt bạn, vì vậy bạn không cần phải làm như vậy một cách rõ ràng. Tuy nhiên, đối với tôi, điều đó luôn giống như dựa vào một chi tiết triển khai. Tôi muốn luôn gọi cả Close và Dispose cho các lớp triển khai chúng, để bảo vệ khỏi các thay đổi / lỗi triển khai và vì mục đích rõ ràng. Một phương pháp Dispose được triển khai đúng cách sẽ an toàn khi gọi nhiều lần.



6

Không gọi điện Closecó thể bỏ qua việc gửi một loạt các tin nhắn Win32 mà người ta nghĩ là hơi quan trọng mặc dù tôi không thể cho bạn biết cụ thể tại sao ...

Closecó lợi ích trong việc nâng cao các sự kiện (có thể bị hủy bỏ) để người ngoài (trong biểu mẫu) có thể theo dõi FormClosingFormClosedđể phản ứng phù hợp.

Tôi không rõ liệu FormClosingvà / hoặc FormClosedcó được nêu ra hay không nếu bạn đơn giản loại bỏ biểu mẫu nhưng tôi sẽ để bạn thử nghiệm.


2
Nếu bạn hủy biểu mẫu, thì các sự kiện đóng và sự kiện đã đóng sẽ không được gọi.
ma trận

4
gọi phương thức Dispose sẽ gây nhấp nháy của cửa sổ khi được sử dụng trên phương thức-Form qua cửa sổ MDI-con
dotNETbeginner

1

Sử dụng usinglà một cách khá tốt:

using (MyForm foo = new MyForm())
{
    if (foo.ShowDialog() == DialogResult.OK)
    {
        // your code
    }
}

0

Close () - tài nguyên được quản lý có thể tạm thời bị đóng và có thể mở lại.

Dispose () - xóa vĩnh viễn tài nguyên được quản lý hoặc không được quản lý


3
Điều này chỉ đúng nếu biểu mẫu được hiển thị bằng cách sử dụng ShowDialog(). Nếu không, Close()cũng sẽ loại bỏ biểu mẫu.
Peter Duniho

-1

Nếu bạn sử dụng form.close () trong biểu mẫu của mình và đặt Sự kiện đóng biểu mẫu của biểu mẫu và sử dụng form.close () trong Sự kiện này, bạn sẽ rơi vào vòng lặp không giới hạn và Đối số nằm ngoài phạm vi đã xảy ra và giải pháp là thay đổi biểu mẫu .close () với form.dispose () trong Sự kiện của FormClosing. Tôi hy vọng mẹo nhỏ này sẽ giúp bạn !!!


-1

Những gì tôi vừa thử nghiệm với các công cụ chẩn đoán VS được gọi là this.Close () sau đó kích hoạt sự kiện định dạng đóng gói. Sau đó, khi tôi gọi this.Dispose () ở cuối trong sự kiện Formclosing nơi tôi loại bỏ nhiều đối tượng khác trong đó, nó làm sạch mọi thứ mượt mà hơn nhiều.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.