2008-08-25 30 views
14

Trong C#, sự khác biệt (nếu có) giữa hai dòng mã này là gì?Sự khác biệt giữa các sự kiện đấu dây có và không có "mới"

tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick); 

tmrMain.Elapsed += tmrMain_Tick; 

Cả hai xuất hiện để làm việc giống hệt nhau. Liệu C# chỉ giả sử bạn có nghĩa là trước đây khi bạn gõ sau này?

+0

Vâng, cả hai đều hoạt động tốt. Sau đó, tại sao Visual Studio chọn cái cũ hơn sau khi nó tự động tạo ra trình xử lý sự kiện? – Vaibhav

+0

Tính năng này có từ ngày trước Visual Studio 2005, giới thiệu cú pháp ngắn hơn. – SLaks

Trả lời

25

Tôi đã làm điều này

static void Hook1() 
{ 
    someEvent += new EventHandler(Program_someEvent); 
} 

static void Hook2() 
{ 
    someEvent += Program_someEvent; 
} 

Và sau đó chạy ildasm hơn mã.
MSIL được tạo giống hệt nhau.

Vì vậy, để trả lời câu hỏi của bạn, có chúng giống nhau.
Trình biên dịch chỉ là suy luận mà bạn muốn someEvent += new EventHandler(Program_someEvent);
- Bạn có thể nhìn thấy nó tạo ra các đối tượng mới EventHandler trong cả hai trường hợp trong MSIL

2

Tôi không nghĩ có bất kỳ sự khác biệt. Chắc chắn resharper nói dòng đầu tiên có mã dự phòng.

-1

Tôi nghĩ rằng một trong những cách để thực sự nói sẽ phải nhìn vào MSIL sản xuất cho mã .. Có xu hướng trở thành một thử nghiệm axit tốt ..

Tôi có mối quan tâm vui mà nó có thể bằng cách nào đó gây rối với GC. Có vẻ kỳ quặc rằng sẽ có tất cả các chi phí khai báo loại đại biểu mới nếu nó không bao giờ cần phải được thực hiện theo cách này, bạn biết không?

0

Không phải là new XYZEventHandler yêu cầu cho đến khi C# 2003 và bạn được phép bỏ qua mã dự phòng trong C# 2005?

4

Nó từng là (.NET 1.x ngày) mà hình thức dài là cách duy nhất để làm điều đó. Trong cả hai trường hợp, bạn đang làm mới một đại biểu để trỏ đến phương thức Program_someEvent.

2

Một Offtopic chút:

Bạn có thể nhanh chóng một đại biểu (new EventHandler(MethodName)) và (nếu phù hợp) tái sử dụng trường hợp đó.

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