Friday , 22 November 2024
HOT

Biểu thức Lambda

Biểu thức lambda là một phương cách mới trong việc tạo các hàm vô danh (anonymous). Nó có thể chứa các câu lệnh cũng như các biểu thức khác. Một biểu thức Lambda trả về kết quả của một biểu thức và có dạng như sau:

(input parameters) => expression

 

Dấu mở và đóng ngoặc là tùy chọn trong trong trường hợp chỉ có 1 tham số, ngược lại nó là bắt buộc. Nếu có nhiều hơn 1 tham số thì chúng sẽ được phân cách bằng dấu phẩy (,). Kiểu của các tham số có thể được khai báo tường minh hoặc không, nếu không khai báo, trình duyệt sẽ tự xác định kiểu, tuy nhiên trong một số trường hợp, bạn phải chỉ rõ kiểu của nó, ví dụ:

s => s.Length (lỗi, vì trình dịch không thể biết được s là gì)

bạn khải khai báo như sau:

(string s) => s.Length

Một biểu thức lambda dùng toán tử =>, mang ý nghĩa như là “đi đến”. Phía bên trái của toán tử là các tham số (nếu có), bên phải là các biểu thức hay câu lệnh. Ví dụ như biểu thức lambda x => x * x sẽ tương đương với hàm sau:

int f(int x) {

return x * x;

}

Một biểu thức lambda có thể được dùng để tạo các delegate giống như sau:
delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5);

Toán tử => có cùng độ ưu tiên như phép gán = và được xét từ phải sang trái, do vậy câu lệnh d = x => x * x sẽ có ý nghĩa khác với x => d = x * x. Ở câu lệnh thứ nhất, d sẽ có kiểu delegate và nó đại diện cho biểu thức lambda x => x*x, câu lệnh thứ 2 hoàn toàn là 1 biểu thức lambda, trong đó d sẽ mang giá trị của bình phương giá trị được truyền vào.

Các biểu thức lambda thường được dùng trong các câu truy vấn LINQ như là các tham số của các mệnh đề truy vấn kiểu như Where.

Các biểu thức lambda không được phép xuất hiện bên trái toán tử is hay as. Và các hạn chế của phương thức anonymous cũng được áp dụng cho biểu thức lambda.

Trong phần thân của một biểu thức lambda, bạn có thể thực hiện các lời gọi hàm, tuy nhiên cần chú ý là nếu biểu thức của bạn sẽ được thực thi trong một môi trường khác, kiểu như thực thi bên trong SQL Server, bạn không được dùng các lời gọi hàm vì các phương thức bạn gọi có thể không có ý nghĩa trong môi trường đó. Ví dụ như biểu thức sau có thể sẽ không dùng được nếu được viết bên trong một thủ tục CLR:

(int x) => { MessageBox.Show(x.ToString()); return x * 10; };

Các biểu thức lambda có thể không trả về giá trị, chẳng hạn: (string s) =>{ System.Console.Write(s.Length); };

Leave a Reply

Your email address will not be published. Required fields are marked *

*