2010-10-14 35 views

Trả lời

6

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.

3

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.

0

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

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