Một lambda có thể được thực hiện bằng cách sử dụng một đóng cửa, nhưng nó không phải là bản thân nó nhất thiết là một đóng cửa.
A closure là "một hàm cùng với môi trường tham chiếu cho các biến không phải cục bộ của hàm đó".
Khi bạn tạo biểu thức lambda sử dụng các biến được xác định bên ngoài phương thức, thì lambda phải được triển khai bằng cách đóng. Ví dụ:
int i = 42;
Action lambda =() => { Console.WriteLine(i); };
Trong trường hợp này, trình biên dịch tạo ra phương pháp phải có quyền truy cập vào biến (i
) định nghĩa trong một phạm vi hoàn toàn khác nhau. Để làm việc này, phương thức nó tạo ra là một "hàm cùng với môi trường tham chiếu" - về cơ bản, nó tạo ra một "đóng cửa" để truy xuất biến đó.
Tuy nhiên, lambda này:
Action lambda2 =() => { Console.WriteLine("Foo"); }
không dựa trên bất kỳ "môi trường tham khảo", vì nó là một phương pháp chứa đầy đủ. Trong trường hợp này, trình biên dịch tạo ra một phương thức tĩnh bình thường, và không có đóng cửa nào cả.
Trong cả hai trường hợp, lambda đang tạo một delegate
("đối tượng hàm"), nhưng nó chỉ tạo ra đóng trong trường hợp đầu tiên, vì lambda không nhất thiết phải "chụp" môi trường tham chiếu trong mọi trường hợp .
Nguồn
2012-03-06 20:47:05
NB được gọi là đóng. "Clojure" là một ngôn ngữ (do đó tôi chỉnh sửa). –
Ah - điều đó chắc chắn xóa bỏ sự nhầm lẫn đó! Cảm ơn –
Đóng cửa là một khía cạnh của biểu thức lambda. Lambdas không nhất thiết phải hỗ trợ đóng cửa. Một số ngôn ngữ thực hiện nó một cách khác nhau. Ví dụ, Java là khác nhau từ C# trong đó trước đây không cho phép sửa đổi của đóng trên biến trong chức năng. Điều đó nói rằng tôi nghĩ rằng câu hỏi này là về sự hiểu biết chung, do đó trùng lặp của [Sự khác biệt giữa một 'đóng cửa' và 'lambda' là gì?] (Http://stackoverflow.com/questions/220658/what-is-the- sự khác biệt giữa một-một-đóng-và-một-lambda) – nawfal