Khi từ khóa delegate
được sử dụng trong C#, trình biên dịch C# sẽ tự động tạo ra một lớp bắt nguồn từ lớp System.MulticastDelegate
.Trình biên dịch tạo lớp kín cho từ khóa đại biểu chứa các phương thức ảo
Lớp trình biên dịch được tạo này chứa 3 phương pháp: Invoke, BeginInvoke and EndInvoke
.
Tất cả ba phương pháp này được đánh dấu public virtual extern
nhưng thú vị là chính lớp đó được đánh dấu sealed
.
Các phương pháp ảo được xác định trong một lớp được niêm phong không chỉ là các cảnh cáo như phản trực giác mà thực sự là bất hợp pháp trong C#.
Vì vậy, câu hỏi của tôi là, có một lý do cụ thể cho điều này hay là nó chỉ là một trong những điều vô hại được thực hiện trong tâm trí một số tăng cường tương lai giả định?
Sửa 1:
lý do có thể là để buộc sử dụng IL opcode 'callvirt' như trái ngược với 'gọi' để đối tượng delegate luôn được chọn for null bởi CLR trước khi cố gắng để thực hiện một trong ba phương pháp? Mặc dù tôi không thấy lý do tại sao một delegate
phải là một trường hợp đặc biệt về mặt này.
Cũng không phải là nó một hit hiệu suất để buộc sử dụng callvirt
(mặc dù nó có thể là rất nhỏ)
Chỉnh sửa 2:
Added CIL thẻ, khi nó quay ra rằng C# cách xác định các đại biểu thực tế được yêu cầu bởi tiêu chuẩn CIL. Trạng thái chuẩn (sau đây không phải là toàn văn)
Đại biểu phải có loại cơ sở là System.Delegate. Các đại biểu phải được tuyên bố bịt kín và các thành viên duy nhất mà một đại biểu sẽ có là hoặc hai hoặc tất cả bốn phương pháp đầu tiên được chỉ định tại đây. Các phương thức này sẽ được khai báo thời gian chạy và được quản lý. Họ sẽ không có một cơ thể , vì cơ thể đó sẽ được tạo ra tự động bởi VES. Các phương thức khác có sẵn trên các đại biểu được kế thừa từ lớp System.Delegate trong Thư viện lớp cơ sở. Các phương pháp đại biểu là:
- Các constructor dụ
- các phương thức Invoke sẽ ảo
- Phương pháp BeginInvoke, nếu có, sẽ là ảo
- Phương pháp EndInvoke sẽ ảo
Vì vậy, điều này chắc chắn không phải là một tác dụng phụ của quá trình biên dịch hoặc tương tự như các đầu ra trình biên dịch thú vị khác.
Nếu tiêu chuẩn nhấn mạnh điều gì đó, nó phải vì một số lý do chính đáng và lý do hợp lý.
Vì vậy, câu hỏi đặt ra là tại sao tiêu chuẩn CIL cho các đại biểu nhấn mạnh vào niêm phong và ảo cùng một lúc?
Liệu bắt nằm đây ?:
Họ sẽ không có một cơ thể, kể từ khi cơ thể được tạo ra tự động bởi VES.
Chúng được đánh dấu ảo sao cho nội dung được tạo VES/CLR có thể được thực hiện khi gọi các phương pháp này?
Đừng quên, những gì không hợp lệ trong C# có thể hoàn toàn hợp lệ trong IL - có những trường hợp khác hiện tại, đây có thể là trường hợp khác. Nhưng +1 cho tìm kiếm thú vị. –
Tôi đã thử rằng với ILDasm và từ khóa ghi đè được dịch sang ảo trong IL. – MBen
@MBen có nhưng đối với lớp đại biểu được tạo ra C# thì không có phương thức lớp cơ sở tương ứng nào để ghi đè. Do đó từ khóa ảo ở đây không phải là kết quả của 'override' :) –