C# - C Sharp: Phương thức không tên
Giải phóng thời gian, khai phóng năng lực
Tổng quan
Phương thức không tên (Anonymous method) là một khối mã lệnh không có tên và có thể được truyền như là một tham số delegate.
Thông thường thì delegate có thể gọi một hoặc nhiều phương thức có tên và được áp dụng trong khi khai báo delegate. Trước khi có phương thức không tên, nếu ta muốn truyền một khối lệnh nhỏ tới một delegate thì ta luôn phải tạo một phương thức chứa khối lệnh nhỏ đó và truyền phương thức đó tới delegate; nhưng khi áp dụng phương thức không tên thì đơn giản ta chỉ cần truyền đi khối mã lệnh bên trong tới delegate mà không phải đặt nó vào một phương thức có tên cụ thể (tạo phương thức thực sự).
Dưới đây là một ví dụ áp dụng phương thức không tên:
using System; namespace Demo { class Demo { static void Main(string[] args) { System.Threading.Thread th = new System.Threading.Thread( delegate () { Console.WriteLine("Example about Anonimous Method!"); }); th.Start(); } } }
Kết quả của ví dụ trên được thể hiện ở hình dưới đây:
Đặc điểm của phương thức không tên
Phương thức không tên chỉ có thể được sử dụng thay cho phương thức có tên nếu phương thức không tên đó được gọi thông qua một delegate.
Mỗi phương thức không tên đều có những đặc điểm sau đây:
· Xuất hiên như một khối mã lệnh nội tuyến trong khai báo delegate.
· Là lựa chọn tốt nhất cho những khối mã lệnh nhỏ.
· Chấp nhận tham số với kiểu bất kỳ.
· Sử dụng được cả những tham số có kiểu generic
· Không được sử dụng những câu lệnh nhảy như goto, break, ... để chuyển quyền điều khiển ra ngoài phạm vi của phương thức.
Tạo phương thức không tên
Phương thức không tên được tạo khi bạn khởi tạo hoặc tham chiếu đến một delegate với một khối lệnh không tên. Những điều sau đây ta cần lưu ý khi tạo phương thức không tên:
· Ta có thể tạo phương thức không tên nằm bên ngoài hoặc bên trong phương thức có tên.
· Một khi đã xuất hiện từ khóa delegate trong thân của một phương thức thì bắt buộc delegate đó phải được theo sau bởi một khối mã lệnh không tên.
· Phương thức không tên được định nghĩa phải bao gồm cặp ngoặc xoắn ({}) khi tạo một đối tượng của delegate.
· Phương thức không tên không được có kiểu trả về.
· Phương thức không tên không được có bổ từ truy cập.
Cú pháp:
, trong đó:
Access_modifier: Là bổ từ truy cập, bao gồm các bổ từ như public, protected, private, intarnal, protected intarnal.
Delegate_name: Là tên của delegate do ta tự đặt (đương nhiên phải tuân theo quy tắc đặt tên trong C#).
Đoạn mã dưới đây minh họa cách tạo và sử dụng phương thức không tên:
using System; namespace Demo { class AnonymousMethods { delegate void Display(); //Tạo phương thức không tên nằm bên ngoài phương thức có tên static Display objDisplay = delegate () { Console.WriteLine("This anonymous method is outside the named method."); }; static void Main(string[] args) { //Tạo phương thức không tên nằm bên trong phương thức có tên Display objDisp = delegate () { Console.WriteLine("This anonymous method is inside the named method."); }; objDisp(); } } }
Kết quả của đoạn mã trên:
Tham chiếu tới nhiều phương thức không tên
C# cho phép bạn tạo và khởi tạo một delegate để có thể tham chiếu tới nhiều phương thức không tên. Điều này được thực hiện bằng cách sử dụng toán tử +=. Toán tử += được dùng để bổ sung thêm các tham chiếu tới phương thức không tên hoặc có tên sau khi đã khởi tạo delegate. Ví dụ:
using System; namespace Demo { class MultipleAnonymousMethods { delegate void Display(); static void Main(string[] args) { //delegate được khởi tạo với một tham chiếu đến phương thức không tên Display objDisp = delegate () { Console.WriteLine("This illustrates one anonymous method"); }; //delegate được bổ sung thêm một phương thức không tên nữa objDisp += delegate () { Console.WriteLine("This illustrates another anonymous method with the same delegate instance"); }; objDisp(); } } }
Kết quả của chương trình trên:
Biến ngoài (outer) của phương thức không tên
Ta có thể khai báo biến trong phương thức không tên, những biến này gọi là biến ngoài (outer). Các biến outer sẽ được 'chụp - capture' lại khi chúng được sử dụng đến; chúng sẽ được lưu trữ trong bộ nhớ cho đến khi delegate được thu dọn. Phạm vi hoạt động của các biến outer chỉ là nội trong phương thức không tên khai báo chúng.
Truyền tham số
C# cho phép truyền tham số tới phương thức không tên. Kiểu của các tham số được xác định ngay tại thời điểm khai báo delegate và các tham số được định nghĩa trong cặp ngoặc tròn sau tên của delegate. Phương thức không tên có quyền truy cập tất cả các tham số này giống như phương thức có tên. Ta có thể truyền giá trị cho các tham số của phương thức không tên khi delegate được gọi. Ví dụ:
using System; namespace Demo { class Parameters { delegate void Display(string str, int num); static void Main(string[] args) { Display objDisp = delegate (string str, int num) { Console.WriteLine(str + num); }; objDisp("Value = ", 100); } } }
Kết quả của ví dụ trên:
Lưu ý: Nếu việc định nghĩa phương thức không tên mà không bao gồm bất kỳ đối số nào thì bạn có thể sử dụng cặp ngoặc trống trong khai báo delegate. Phương thức không tên mà không có danh sách tham số thì chỉ có thể đi với những delegate không tham số.
Kiểm tra kiến thức của bạn
Câu nào sau đây là đúng khi nói về phương thức không tên trong C#?
(A): Phương thức không tên là các khối lệnh mà có thể được tích hợp với một cài đặt delegate.
(B): Các tham số của phương thức không tên luôn luôn có kiểu generic.
(C): Các phương thức không tên phù hợp với các khối lệnh nhỏ và lớn.
(D): Các biên được khai báo trong phương thức không tên được gọi là biến ngoài.
(E): Các giá trị của các tham số trong một phương thức không tên được truyền khi delegate được gọi.
Các lựa chọn cho bạn:
Phương án 1: (A), (D), (E)
Phương án 2: (B), (C)
Phương án 3: (C), (E)
Phương án 4: (D)
Giải phóng thời gian, khai phóng năng lực