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ề ý this
nghĩa của từ khóa trong trường hợp này. Bất kỳ hiểu biết?
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ề ý this
nghĩa của từ khóa trong trường hợp này. Bất kỳ hiểu biết?
Câu trả lời:
Đâ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.
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.
this
từ 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!
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 <>"):
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.
Chúng là các phương pháp mở rộng . Chào mừng đến với một thế giới hoàn toàn mới . :)
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).
"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.