2009-05-11 6 views
207

Tôi đã đi qua một số trường hợp của C# code như sau:Sử dụng từ khóa "này" trong các thông số chính thức cho các phương pháp tĩnh trong C#

public static int Foo(this MyClass arg) 

tôi đã không thể tìm thấy một lời giải thích về những gì từ khóa this có nghĩa là trong trường hợp này. Bất kỳ thông tin chi tiết nào?

+8

Ngoài câu trả lời được chấp nhận, đối với Phương thức mở rộng C#, bạn phải kiểm tra chính thức [tài liệu MSDN] (http://msdn.microsoft.com/en-us/library/bb383977.aspx). –

+3

Phương pháp mở rộng thuận tiện nhưng chúng ta phải thận trọng khi tạo/sử dụng chúng - chúng có thể bị hỏng! Trích dẫn từ Nguyên tắc chung trong [tài liệu MSDN chính thức] (https://msdn.microsoft.com/en-us/library/bb383977.aspx): "Nói chung, chúng tôi khuyên bạn nên triển khai các phương pháp mở rộng một cách tiết kiệm và chỉ khi bạn phải. ... Khi sử dụng một phương pháp mở rộng để mở rộng một loại có mã nguồn mà bạn không thể thay đổi, bạn chạy nguy cơ thay đổi trong việc thực hiện loại sẽ làm cho phương pháp mở rộng của bạn bị hỏng. " –

Trả lời

205

Đây là phương thức mở rộng . Xem ở đây để xem explanation.

phương pháp mở rộng cho phép các nhà phát triển thêm các phương pháp mới cho công chúng hợp đồng của một kiểu CLR hiện có, mà không cần phải sub-class hay biên dịch lại kiểu ban đầu. Các phương pháp mở rộng giúp kết hợp tính linh hoạt của tính năng "nhập vịt" hỗ trợ phổ biến trong các ngôn ngữ động hôm nay với hiệu suất biên dịch và biên dịch của các ngôn ngữ được đánh máy mạnh mẽ.

Phương thức mở rộng cho phép nhiều trường hợp hữu ích khác nhau và giúp làm cho khung truy vấn LINQ thực sự mạnh mẽ trở thành .

nó có nghĩa là bạn có thể gọi

MyClass myClass = new MyClass(); 
int i = myClass.Foo(); 

hơn

MyClass myClass = new MyClass(); 
int i = Foo(myClass); 

Điều này cho phép việc xây dựng fluent interfaces như được nêu dưới đây.

3

Tôi vừa mới học được điều này vào ngày khác: từ khóa này xác định rằng phương thức đã là phần mở rộng của lớp học. Vì vậy, đối với ví dụ của bạn, MyClass sẽ có một phương thức mở rộng mới được gọi là Foo (không chấp nhận bất kỳ tham số nào và trả về một int; nó có thể được sử dụng như với bất kỳ phương thức công khai nào khác).

22

Scott Gu's quoted blog post giải thích nó độc đáo.

Đối với tôi, câu trả lời cho câu hỏi là trong báo cáo sau trong bài rằng:

Lưu ý cách phương pháp tĩnh trên có một "này" từ khóa trước khi tranh luận tham số đầu tiên của loại chuỗi. Điều này cho trình biên dịch biết rằng Phương thức mở rộng cụ thể cần được thêm vào đối tượng thuộc loại "chuỗi". Trong IsValidEmailAddress() thực hiện phương pháp tôi có thể sau đó truy cập tất cả các công thuộc tính/phương pháp/sự kiện của trường hợp chuỗi thực tế rằng phương pháp đang được kêu gọi, và trở đúng/sai tùy thuộc vào việc nó là một email hợp lệ hay không.

12

Ngoài Preet Tăng của lời giải thích:
Intellisense sẽ hiển thị các phương pháp khuyến nông với một mũi tên màu xanh (ví dụở phía trước "tổng hợp <>"):

enter image description here

Bạn cần một

using the.namespace.of.the.static.class.with.the.extension.methods; 

cho phương pháp khuyến nông để xuất hiện và sẽ có sẵn, nếu họ đang ở trong một không gian tên khác với mã Sử dụng chúng.

1

"này" mở rộng lớp tiếp theo trong danh sách tham số

Vì vậy, trong ký hiệu phương thức bên dưới "này" mở rộng "Chuỗi". Dòng được truyền cho hàm như một đối số bình thường cho phương thức. chuỗi tĩnh công cộng [] SplitCsvLine (dòng Chuỗi này)

Trong ví dụ trên, lớp "này" đang mở rộng lớp được xây dựng trong "Chuỗi".