Trình biên dịch C# triển khai các phương thức mở rộng như thế nào?Phương pháp mở rộng được biên dịch như thế nào?
Trả lời
Quá trình này là chính xác giống như độ phân giải quá tải:
Func(myObject);
sẽ kiểm tra trình biên dịch tất cả các chức năng có tên là "Func" và cố gắng để phù hợp với loại tĩnh của myObject đến parametrs (có thể sử dụng chuyển đổi, upcasting đến cơ sở lớp học). Nếu thành công, sau đó gọi hàm thích hợp.
Nếu bạn nhận ra rằng bạn có thể gọi các phương thức mở rộng "theo một cách bình thường", sau đó nó sẽ tự hết:
static class MyExtensions
{
public static void MyFunc(this string arg)
{
// ...
}
}
string a = "aa";
MyExtensions.MyFunc(a); // OK
a.MyFunc(); // same as above, but nicer
Đối với loại nhất định (ở đây string), trình biên dịch chỉ trông cho tất cả các chức năng tĩnh với "điều này" sửa đổi trên đối số đầu tiên và cố gắng để phù hợp với các loại tĩnh ở bên trái của. (trong ví dụ này "a") với kiểu tham số trong hàm.
Phương thức thể hiện của một lớp có đối số ẩn. Một ví dụ:
class Example {
public void Foo(int arg) {}
}
thực sự trông như thế này khi trình biên dịch JIT được thực hiện với nó, chuyển đổi trở lại C# Cú pháp:
static void Foo(Example this, int arg) {}
Đó luận ẩn là lý do mà bạn có thể sử dụng này trong một phương thức thể hiện. Trình biên dịch JIT tìm ra đối số để chuyển từ tham chiếu đối tượng mà bạn cung cấp để gọi phương thức Foo.
Như bạn có thể biết, bây giờ là rất ngắn ngắn gọn về phương pháp tiện ích mở rộng.
Trình biên dịch đầu tiên sẽ tìm trong lớp cơ sở cho hàm phù hợp với chữ ký của hàm. Nếu nó không thể tìm thấy nó hơn là tìm một phần mở rộng. Nếu một phần mở rộng có chữ ký giống như một phương thức lớp cơ sở hơn là phương thức lớp cơ sở được gọi thay thế.
Điều này có thể hữu ích: Extension Methods
- 1. PHP - mở rộng phương pháp như mở rộng một lớp
- 2. biên dịch lỗi phương pháp C# mở rộng tham khảo tùy chỉnh
- 3. Phương pháp mở rộng và kiểm tra thời gian biên dịch
- 4. C# giống như các phương pháp mở rộng trong PHP?
- 5. Phương pháp mở rộng ảo?
- 6. Phương pháp mở rộng cho nullable enum
- 7. phương pháp mở rộng để mở rộng lớp tĩnh
- 8. Phương pháp mở rộng chuỗi trong C#
- 9. Biên dịch AST python sang phương pháp
- 10. LINQ và phương pháp mở rộng Đếm
- 11. javascript prototype mở rộng phương pháp
- 12. Tổ chức các phương pháp mở rộng
- 13. Phương pháp mở rộng trên lớp tĩnh?
- 14. Làm thế nào để có được các phương pháp mở rộng trên Roslyn?
- 15. Làm thế nào để buộc sử dụng phương pháp mở rộng thay vì phương pháp dụ với thông số?
- 16. Phương pháp mở rộng bằng Python
- 17. Phương pháp mở rộng liệt kê
- 18. Phương pháp mở rộng cho Enumerable.Intersperse?
- 19. Mã LINQPad biên dịch như thế nào?
- 20. Độ phân giải phương pháp mở rộng
- 21. Cách tạo phương pháp mở rộng chung?
- 22. Chi phí nào được kết hợp với phương pháp mở rộng khi chạy? (NET)
- 23. Phương pháp mở rộng TryParse chung
- 24. Mocking Phương pháp mở rộng với Moq
- 25. tôi không thể biên dịch phương pháp
- 26. Phương pháp mở rộng tĩnh trên mô-đun Seq
- 27. Phần mở rộng tệp .jspf là gì? Làm thế nào để biên dịch nó?
- 28. phương pháp mở rộng với nhiều loại generic cụ
- 29. Phương pháp mở rộng LINQ "Gấp" ở đâu?
- 30. Vấn đề truy vấn được biên dịch từ LINQ to SQL (hoạt động như truy vấn chưa được biên dịch)