2011-12-24 31 views

Trả lời

40

Không ai là "tốt hơn" khác; chúng hoàn toàn tương đương!

Tuy nhiên, trong trường hợp cụ thể này, cả hai đều sai. Số ShowDialog method yêu cầu bạn gọi phương thức Dispose trên biểu mẫu. Không giống như kết hợp ShowClose, điều này không được thực hiện tự động. Từ MSDN:

Khi một hình thức được hiển thị như một hộp thoại modal, nhấp vào nút Close (nút có dấu X ở góc trên bên phải của tờ khai) gây ra các hình thức để được ẩn và tài sản DialogResult được đặt thành DialogResult.Cancel. Không giống như các hình thức không phương thức, phương thức Close không được gọi bởi Khuôn khổ .NET khi người dùng nhấp vào nút biểu mẫu đóng của hộp thoại hoặc đặt giá trị của thuộc tính DialogResult. Thay vào đó, biểu mẫu bị ẩn và có thể được hiển thị lại mà không cần tạo một phiên bản mới của hộp thoại. Vì biểu mẫu được hiển thị dưới dạng hộp thoại bị ẩn thay vì đóng, bạn phải gọi phương thức Dispose của biểu mẫu khi đơn đăng ký không còn cần thiết nữa.

Vì vậy, bạn nên lựa chọn giữa một trong những hình thức (tương đương):

using (Form1 frm = new Form1()) 
{ 
    frm.ShowDialog(); 
} 

hoặc

Form1 frm = new Form1(); 
frm.ShowDialog(); 
frm.Dispose(); 

Lý do mà ShowDialog không tự động xử lý các hình thức đơn giản là đủ, nếu không rõ ràng ngay lập tức. Nó chỉ ra rằng các ứng dụng thường muốn đọc các giá trị từ một thể hiện của một dạng hộp thoại phương thức sau khi biểu mẫu đã bị đóng, chẳng hạn như các cài đặt được chỉ định trong các điều khiển của biểu mẫu. Nếu biểu mẫu được tự động xử lý, bạn sẽ không thể đọc các giá trị đó bằng cách truy cập các thuộc tính của đối tượng biểu mẫu. Do đó, lập trình viên chịu trách nhiệm xử lý các biểu mẫu được hiển thị dưới dạng các hộp thoại phương thức khi (s) anh ta kết thúc với chúng.

+0

Làm rõ tuyệt vời về lý do MODAL giữ biểu mẫu trong bộ nhớ để trích xuất các phần tử khác khi đóng và không tự động giải phóng. – DRapp

+0

Chỉ cần làm rõ: nếu thể hiện biểu mẫu được giữ trong một biến cục bộ, nó sẽ đủ điều kiện thu gom rác khi nó nằm ngoài phạm vi và sẽ * được xử lý (xem SO [answer] này (http://stackoverflow.com)/a/11690188/945456)). Tuy nhiên, bạn nên làm điều đó một cách rõ ràng. –

+0

Trừ phần còn lại, câu đầu tiên là ** sai **. Vì bạn phải/nên gọi 'frm.Dispose();' cái thứ 2 tệ hơn cái đầu tiên. _Sự xấu hổ khi xem câu trả lời hay sau đó! – Bitterblue

2

Nói chung tôi sẽ đi cho 1 đầu tiên bởi vì bạn có thể truy cập các hình thức sau đó.

Nếu không thì lần bật thứ 2 là ok, nếu bạn không muốn xử lý sau khi đóng.

+0

việc vứt bỏ bộ nhớ() tại (biểu mẫu mới1()). ShowDialog(); ? –

+0

bạn có hỏi liệu bộ nhớ có được xử lý sau khi showdialog kết thúc hay không. Nếu vậy, sau đó ông nhớ cho bất kỳ đối tượng trong C# được xử lý một khi không có gì tham khảo nó nữa. Vì vậy, một khi hộp thoại được đóng tất cả các tài liệu tham khảo đã biến mất và GC sẽ làm điều của nó. –

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