2010-03-02 35 views

Trả lời

12

Cũng giống như + = đăng ký bạn một trình xử lý cho sự kiện, - = hủy đăng ký nó.

Sử dụng nó khi bạn không còn muốn một trình xử lý cụ thể được gọi khi sự kiện được nâng lên. Bạn thường chỉ cần sử dụng nó thành phần nâng cao sự kiện là sống lâu hơn so với người xử lý sự kiện - nếu bạn không hủy đăng ký, "người tổ chức sự kiện" có hiệu quả có tham chiếu đến trình xử lý, vì vậy có thể giữ cho nó tồn tại lâu hơn bạn muốn.

Như đã đề cập trong ý kiến:

  • -= sẽ chỉ xóa trình xử lý đơn; nếu có nhiều trình xử lý được đăng ký (thậm chí sử dụng cùng một ủy nhiệm chính xác), nó sẽ vẫn chỉ giảm số lượng bộ điều khiển bằng 1. Ví dụ cuối cùng của trình xử lý được chỉ định là trình xử lý được loại bỏ. (Vì vậy, nếu trước đây bạn đã xử lý A, B, A, C đã đăng ký theo thứ tự đó và xóa A, bạn sẽ kết thúc bằng A, B, C.)
  • -= không gây ra lỗi nếu trình xử lý được chỉ định chưa được đăng ký với người được ủy quyền; nó chỉ bỏ qua yêu cầu. Điều này đúng ngay cả khi sự kiện không có trình xử lý nào được đăng ký vào lúc này.
+6

+1. Cũng cần lưu ý rằng việc không hủy đăng ký một sự kiện thường là nguyên nhân của một chương trình hết bộ nhớ, vì nó ngăn các đối tượng trở thành đủ điều kiện cho GC. – RichardOD

+0

Jon, tôi hơi sợ hãi bởi thực tế chúng tôi đều bắt đầu câu trả lời của mình với "Just as ..." ;-) –

+0

phiên bản VB.NET của '- =' ..Tôi có nghĩa là cách hủy đăng ký từ một biến cố..? – dotNETbeginner

6

Cũng giống như bạn có thể thêm trình xử lý sự kiện qua +=, bạn có thể xóa chúng qua -=.

Ví dụ:

mybutton.Click += new EventHandler(myhandler); 

Bạn sau đó có thể loại bỏ nó như thế này:

mybutton.Click -= new EventHandler(myhandler); 

... bởi vì xử lý sự kiện cho cùng phương pháp và ví dụ tương đương (do đó bạn không cần để giữ lại tham chiếu đến trình xử lý bạn đã sử dụng với += và sử dụng trình xử lý đó với -=).

3

Các +=-= khai thác có thể được sử dụng trong C# để thêm/xóa xử lý sự kiện đến/từ một trong những sự kiện của một đối tượng:

// adds myMethod as an event handler to the myButton.Click event 
myButton.Click += myMethod; 

Sau khi mã trên chạy, phương pháp myMethod sẽ được gọi mỗi khi myButton được nhấp.

// removes the handler 
myButton.Click -= myMethod; 

Sau khi mã trên chạy, nhấp vào myButton sẽ không còn gây myMethod được gọi.

1

Tôi nghi ngờ rằng logic nền của + = là thêm trình xử lý vào danh sách/mảng xử lý sự kiện cho sự kiện đã cho. Khi - = được sử dụng, nó so sánh đối số bàn tay phải của bạn với danh sách các trình xử lý sự kiện mà nó đang giữ cho sự kiện này và xóa nó khỏi danh sách. Nếu bạn thực hiện nhiều + = cho một sự kiện cụ thể, thì mỗi trình xử lý sẽ được gọi.

Nói cách khác: + = nghĩa là thêm phương thức vào danh sách các phương thức để gọi khi sự kiện xảy ra. - = nghĩa là xóa phương thức đã chỉ định khỏi danh sách các phương thức cần gọi.

Nếu tất cả bị xóa, sự kiện sẽ không có trình xử lý và sự kiện sẽ bị bỏ qua.

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