2011-06-17 61 views
10

Nếu tôi tạo ra một đại biểu trong mã của tôi như:delegate.Invoke hoạt động như thế nào?

delegate void dostuff (string o); 

này tạo ra một lớp dẫn xuất từ ​​System.MulticastDelegate mà thực hiện ba phương pháp - Invoke, BeginInvokeEndInvoke.

Nếu tôi nhìn vào IL biên dịch cho Invoke tất cả tôi thấy là:

.method public hidebysig newslot virtual 
     instance void Invoke(string o) runtime managed 
{ 
} // end of method dostuff::Invoke 

Phương pháp này không chứa mã. Gọi nó hoạt động - đại biểu được gọi, nhưng tôi không thể thấy nó như thế nào.

Trường hợp nào voodoo gọi Invoke thực sự gọi đại biểu đến từ đâu?

+0

Nó chỉ là một phần của khuôn khổ cơ bản .Net - cuộc gọi * là * cuộc gọi để gọi. 'MyDelegate.Invoke()' là giống như 'MyDelegate()' –

+0

MyDelegate() chỉ là cú pháp đường được biên dịch xuống MyDelegate.Invoke() - một cuộc gọi đến phương thức Invoke được tạo ra. IL cho cuộc gọi chỉ đơn giản là * callvirt instance void ConsoleApplication1.Program/dostuff :: Invoke (string) * mà không khác với bất kỳ cuộc gọi phương thức nào khác. –

Trả lời

7

Có thể tìm thấy voodoo ở cuối chữ ký: runtime managed. Lưu ý rằng tất cả các lớp và phương thức được quản lý mà bạn định nghĩa sẽ được trang trí là cli managed.

runtime managed có nghĩa là thời gian chạy cung cấp triển khai các phương pháp được tối ưu hóa trước.

+0

Đại biểu không có hành vi. Nó lặp qua danh sách yêu cầu của nó - một đại biểu có thể đại diện cho nhiều phương thức để gọi - và gọi từng phương thức lần lượt. –

+0

Tôi không thể thấy phương pháp triển khai có thể ghi đè hành vi như thế nào. Đó là một mô hình thú vị, nhưng tôi không thể nhìn thấy bất kỳ bằng chứng nào về cách thức hoạt động của nó. Nó sẽ không làm việc cho các đại biểu multicast mặc dù. Khi tạo đại biểu, nó chắc chắn là lớp đại biểu được tạo ra được tạo ra và hàm tạo của nó được gọi với phương thức được truyền cho nó. Không có voodoo ở đây, nó chỉ là tạo ra các lớp đại biểu tạo ra giống như bất kỳ lớp bình thường được tạo ra. –

+0

@Mongus, đã cập nhật câu trả lời của tôi. Tuy nhiên, lưu ý rằng "hành vi" để lặp qua danh sách yêu cầu không phải là một phần của ủy nhiệm, mà là một phần của System.Delegate. –

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