2009-07-29 45 views
13

Tôi đã tự hỏi nếu đặt một đối tượng thành null sẽ xóa bất kỳ bộ tổ chức sự kiện nào được gắn với các sự kiện đối tượng ...C# Gỡ bỏ rõ ràng Trình xử lý sự kiện

ví dụ:

Button button = new Button(); 
button.Click += new EventHandler(Button_Click); 
button = null; 

button = new Button(); 
button.Click += new EventHandler(Button_Click); 
button = null; 

vv ...

này có gây ra rò rỉ bộ nhớ?

Trả lời

16

Nếu không có tham chiếu nào khác tới button ở bất kỳ đâu, thì không cần phải gỡ bỏ trình xử lý sự kiện ở đây để tránh rò rỉ bộ nhớ. Trình xử lý sự kiện là tham chiếu một chiều, do đó việc xóa chúng chỉ cần thiết khi đối tượng có sự kiện tồn tại lâu và bạn muốn tránh các trình xử lý (tức là đối tượng có phương thức xử lý) sống lâu hơn thời gian cần thiết. Trong ví dụ của bạn, đây không phải là trường hợp.

+0

Điều này có nghĩa là các trình xử lý sự kiện cho các thanh ứng dụng không cần loại bỏ rõ ràng không (ví dụ như statechanged)? –

+0

Đây là tình huống ngược lại. AppBar là một đối tượng tồn tại lâu dài và một trình xử lý sự kiện sẽ ở mức tối thiểu, giữ đối tượng mà các đại biểu đề cập đến còn sống cho đến khi AppBar còn sống và bạn có thể không muốn điều đó xảy ra. Mặt khác, nếu trình xử lý là phương thức trên cửa sổ sở hữu thanh, điều đó không quan trọng. –

8

Xem các cuộc thảo luận here under "The final question: do we have to remove event handlers?"

Kết luận: bạn nên loại bỏ đại biểu đến từ các sự kiện khi họ đạt bên ngoài lớp học riêng của mình; tức là khi bạn đăng ký các sự kiện bên ngoài, bạn sẽ kết thúc đăng ký của bạn khi bạn hoàn tất. Không làm như vậy sẽ giữ cho các đối tượng của bạn dài hơn cần thiết .

11

Tóm tắt: Bạn cần hủy đăng ký rõ ràng khi nguồn sự kiện/nhà xuất bản tồn tại lâu và người đăng ký thì không. Nếu nguồn sự kiện vượt quá số người đăng ký, tất cả người đăng ký được giữ "sống" bởi nguồn sự kiện (không được GC thu thập) trừ khi họ hủy đăng ký (và xóa tham chiếu đến chính họ khỏi danh sách thông báo của nhà xuất bản sự kiện)

Ngoài ra, đây là bản sao của Is it necessary to explicitly remove event handlers in C# và có một câu trả lời hay. Vì vậy, bỏ phiếu để đóng.

+0

Tôi đã xem phần Hỏi & đáp đó. Câu hỏi của tôi là xa hơn về phía trước và đòi hỏi một câu trả lời đơn giản hơn nhiều. – Damien

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