Sử dụng từ khóa này trong từ khóa này trong các tham số chính thức cho các phương thức tĩnh trong C #


286

Tôi đã gặp một số trường hợp mã C # như sau:

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ề ý thisnghĩa của từ khóa trong trường hợp này. Bất kỳ hiểu biết?


10
Ngoài câu trả lời được chấp nhận, đối với Phương thức mở rộng C #, người ta phải kiểm tra tài liệu MSDN chính thức .
quạ Vulcan

4
Các phương thức mở rộng rất tiện lợi nhưng chúng ta phải thận trọng khi tạo / sử dụng chúng - chúng có thể phá vỡ! Trích dẫn từ Nguyên tắc chung trong tài liệu MSDN chính thức : "Nói chung, chúng tôi khuyên bạn nên triển khai các phương thức mở rộng một cách tiết kiệm và chỉ khi bạn phải. ... Khi sử dụng phương thức mở rộng để mở rộng loại mà mã nguồn bạn không thể thay đổi, bạn có nguy cơ thay đổi trong việc triển khai loại sẽ khiến phương thức mở rộng của bạn bị phá vỡ. "
Krishna Gupta

Điều đó có nghĩa là điều này sẽ có thể? Bởi vì đó là những gì tôi đang tìm kiếm.
facepalm42

Câu trả lời:


274

Đây là một phương pháp mở rộng . Xem ở đây để giải thích .

Các phương thức mở rộng cho phép các nhà phát triển thêm các phương thức mới vào hợp đồng công khai của loại CLR hiện có mà không phải phân lớp hoặc biên dịch lại loại ban đầu. Phương pháp mở rộng giúp pha trộn tính linh hoạt của "gõ vịt" hỗ trợ phổ biến trong các ngôn ngữ động hiện nay với hiệu suất và xác thực thời gian biên dịch của các ngôn ngữ được gõ mạnh.

Phương thức mở rộng cho phép nhiều tình huống hữu ích và giúp tạo khung truy vấn LINQ thực sự mạnh mẽ ....

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

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

thay vì

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

Điều này cho phép xây dựng các giao diện trôi chảy như được nêu dưới đây.


phân lớp rất khó
Gerry

@Gerry - Ý bạn là gì?
Preet Sangha

9
Xin lỗi, một chút mỉa mai - rất nhiều cú pháp ngày nay dường như để giải quyết vấn đề mà tôi thậm chí không biết là vấn đề. Khả năng đọc nên là một ưu tiên rất cao.
Gerry

2
Thành thật mà nói @Gerry, nó giống như bạn đang ở trong Nghịch lý Blub cổ điển . Rất nhiều cú pháp ngày nay giải quyết các vấn đề bạn không gặp phải vì bạn không biết có cách nào tốt hơn hoặc bạn không thực hiện loại nhiệm vụ mà cú pháp này tuyệt vời. Hầu hết các ý kiến ​​về ' đây là một giải pháp tìm kiếm vấn đề ' thực sự là một ví dụ về ' Tôi không biết tính năng đó hoạt động như thế nào, vì vậy nó phải vô dụng '.
Myrddin Emrys

53

Bài viết trên blog của Scott Gu giải thích nó độc đáo.

Đối với tôi, câu trả lời cho câu hỏi nằm trong câu sau đây trong bài đăng đó:

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


9
Đây phải là câu trả lời được chấp nhận. Đó là câu trả lời duy nhất thực sự giải thích mục đích thực sự của thistừ khóa trong chữ ký phương thức là gì. Các câu trả lời khác chỉ nói một cách vô ích "đó là một phương pháp mở rộng." Tôi không bao giờ hiểu đầy đủ về cách các phương thức mở rộng "đính kèm" với các loại chúng mở rộng cho đến khi đọc câu trả lời này. Cảm ơn bạn!
Lews Therin

13

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

nhập mô tả hình ảnh ở đây

Bạn cần một

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

cho các phương thức mở rộng xuất hiện và khả dụng, nếu chúng ở trong một không gian tên khác với mã sử dụng chúng.



4

Tôi mới tự học điều này vào một ngày khác: từ khóa này định nghĩa phương thức đó là một phần mở rộng của lớp tiến hành nó. Vì vậy, với ví dụ của bạn, MyClass sẽ có một phương thức mở rộng mới 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).


1

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

Vì vậy, trong chữ ký 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 khai [] SplitCsvLine (dòng Chuỗi này)

Trong ví dụ trên, lớp "này" đang mở rộng lớp "Chuỗi" tích hợp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.