2008-11-18 34 views
155

Nếu tôi có đoạn mã sau:Trình xử lý sự kiện có ngừng thu gom rác thải không?

MyClass pClass = new MyClass(); 
pClass.MyEvent += MyFunction; 
pClass = null; 

Will pClass được thu gom rác? Hoặc nó sẽ treo xung quanh vẫn bắn các sự kiện của nó bất cứ khi nào chúng xảy ra? Tôi có cần phải làm như sau để cho phép thu gom rác thải không?

MyClass pClass = new MyClass(); 
pClass.MyEvent += MyFunction; 
pClass.MyEvent -= MyFunction; 
pClass = null; 
+9

Tôi dự định sẽ gợi ý cho độc giả quan tâm đến câu hỏi này có thể đáng làm quen với các sự kiện nhẹ/mẫu sự kiện yếu, KHÔNG ngăn việc thu gom rác xảy ra. Một khởi động SO tốt cho chủ đề này là http://stackoverflow.com/questions/185931/weakreference-and-event-handling – fostandy

+13

Lưu ý cho hậu thế: đặt tham chiếu thành null chỉ đơn giản là trì hoãn bộ thu gom rác bằng cách kéo dài một dòng phạm vi tham chiếu. .NET không phải là VB6. –

Trả lời

172

Đối với câu hỏi cụ thể "Đăng ký sự kiện sẽ không ảnh hưởng đến việc thu thập pClass (làm nhà xuất bản).

Đối với GC nói chung (cụ thể là mục tiêu): tùy thuộc vào việc MyFunction là tĩnh hay dựa trên thể hiện.

Một đại biểu (chẳng hạn như đăng ký sự kiện) cho một phương pháp thể hiện bao gồm tham chiếu đến cá thể đó. Vì vậy, có, đăng ký sự kiện sẽ ngăn GC. Tuy nhiên, ngay khi đối tượng xuất bản sự kiện (pClass ở trên) đủ điều kiện để thu thập, điều này không còn là vấn đề nữa.

Lưu ý rằng đây là một chiều; tức là nếu chúng tôi có:

publisher.SomeEvent += target.SomeHandler; 

thì "nhà xuất bản" sẽ giữ "mục tiêu" còn hoạt động, nhưng "mục tiêu" sẽ không giữ "nhà xuất bản" còn hoạt động.

Vì vậy không: nếu pClass sắp được thu thập, bạn không cần hủy đăng ký người nghe. Tuy nhiên, nếu pClass tồn tại lâu (dài hơn trường hợp với MyFunction), thì pClass có thể giữ cho cá thể đó còn sống, do đó, sẽ cần thiết để hủy đăng ký nếu bạn muốn mục tiêu được thu thập.

Sự kiện tĩnh, tuy nhiên, vì lý do này, rất nguy hiểm khi được sử dụng với trình xử lý dựa trên cá thể.

+0

Cảm ơn, đó là điều tôi nghi ngờ. –

+5

Vâng, nếu câu hỏi là "sẽ pClass được thu gom rác thải", sau đó câu trả lời "nó phụ thuộc cho dù ..." là không thực sự chính xác. Nó không phụ thuộc vào bất cứ điều gì, như Marc tự ghi chú thêm xuống. –

+0

@Tor - đủ công bằng - Tôi sẽ làm rõ –

5

Có, pClass sẽ được thu gom rác. Đăng ký sự kiện không ngụ ý rằng bất kỳ tham chiếu nào tồn tại đối với pClass.

Vì vậy, không, bạn sẽ không phải tháo bộ xử lý để pClass bị thu gom rác.

6

Thời điểm một mẩu bộ nhớ không còn được tham chiếu, nó sẽ trở thành một ứng cử viên cho việc thu thập rác. Khi cá thể của lớp bạn vượt quá phạm vi, nó không còn được tham chiếu bởi chương trình của bạn nữa. Nó không còn được sử dụng và do đó có thể được thu thập một cách an toàn.

Nếu bạn không chắc chắn thời tiết nào đó sẽ được thu thập, hãy tự hỏi mình câu hỏi sau: có tồn tại một tham chiếu đến nó không? Trình xử lý sự kiện được tham chiếu bởi cá thể đối tượng, không phải là cách khác xung quanh.

0

pClass sẽ bị thu gom rác. Tuy nhiên, nếu đoạn mã ở trên nằm trong một lớp khác, thể hiện của lớp đó có thể không bị xóa nếu bạn không đặt pClass thành null.

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