2009-09-28 36 views
26

Tôi đã thực hiện việc này một lúc, nhưng tôi không nhận thấy rằng tôi đã sử dụng new mỗi lần tôi xóa trình xử lý sự kiện. Tôi có nên tạo một vật thể mới không?C# xóa một trình xử lý sự kiện

Về cơ bản, có sự khác biệt giữa 1 và 2 không?

  1. ethernetdevice.PcapOnPacketArrival -= new SharpPcap.PacketArrivalEvent(ArrivalResponseHandler);

  2. ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

EDIT: Được rồi đây là một trùng lặp. Xin lỗi vì điều đó. Trả lời được đăng here.

Hai đại biểu cùng loại có cùng mục tiêu, phương pháp và danh sách yêu cầu được coi là bằng nhau.

Trả lời

29

Không có sự khác biệt giữa 1 và 2, bởi vì 2 là cú pháp đường cho 1. Chỉ khi 2 được gọi là trường đại biểu cấp lớp thay vì tên phương thức thực tế thì sẽ có sự khác biệt trong IL biên dịch.

Về điều gì xảy ra khi chạy, sự kiện Remove phương pháp dường như không quan tâm liệu phiên bản ủy nhiệm được chuyển đến nó có giống với phương thức được chuyển đến phương thức Add hay không. Tôi không thể nhớ được tại sao lại là vậy, nhưng tôi đoán rằng các trường hợp đại biểu luôn được thực tập.

EDIT: Jon Skeet nói rằng Phương thức sự kiện Remove sử dụng giá trị bình đẳng (Delegate.Equals) để xác định đại biểu để loại bỏ khỏi danh sách, chứ không phải là thực tập bình đẳng tham khảo +. Cùng một kết quả cuối cùng, phương pháp khác nhau. :-)

+0

Vì đại biểu chỉ là một tham chiếu đến một phương pháp và một cá thể (tùy chọn), so sánh hai trường hợp đó là đủ để xác định sự bình đẳng. – Botz3000

+0

Có, nhưng nói chung, nếu bạn gọi 'new T()' hai lần trên một loại tham chiếu tùy ý, bạn sẽ nhận được hai trường hợp khác nhau. Vì điều này dường như không phải là trường hợp của các đại biểu, tôi suy ra rằng hàm tạo của đại biểu sẽ tự động thực hiện các cá thể giống như lớp 'Type'. –

+0

tập trung - điều đó có nghĩa là gì? Cảm ơn câu trả lời. Loại địa chỉ này tôi nghi ngờ. Tôi đã tự hỏi về điều đó mới khi tôi đang tạo một thể hiện mới khi tôi thêm một trình xử lý và tạo một trình xử lý mới khi tôi xóa nó. Rất kì lạ. – Sharun

13

Phiên bản thứ hai tương đương với phiên bản đầu tiên; nó chỉ sử dụng cú pháp ngắn hơn. Điều này được thực hiện trong C# 2.0

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