Nice programing

Lambda 표현식이 C # 클로저에 있습니까?

nicepro 2020. 12. 9. 21:46
반응형

Lambda 표현식이 C # 클로저에 있습니까?


람다 식 (그리고 어느 정도 익명 함수)이 클로저입니까?

클로저에 대한 필자의 이해는 객체로 취급되는 함수라는 것인데, 이는 익명 함수와 Lambda 표현식이 수행하는 작업을 정확하게 표현한 것 같습니다.

그리고 그들을 폐쇄라고 부르는 것이 옳습니까? 나는 lisp 방언으로 인해 클로저가 생겨 났거나 인기가 있다는 것을 알고 있지만 일반적인 프로그래밍 용어이기도합니까?

제공 할 수있는 모든 설명에 감사드립니다!


람다는 클로저를 사용하여 구현 될 수 있지만 그 자체가 반드시 클로저는 아닙니다.

클로저는 "그 기능의 비 로컬 변수에 대한 참조 환경과 함께 기능."이다.

메서드 외부에 정의 된 변수를 사용하는 람다 식을 만들 때 람다는 클로저를 사용하여 구현되어야합니다. 예를 들면 :

int i = 42;

Action lambda = () => { Console.WriteLine(i); }; 

이 경우 컴파일러 생성 메서드는 i완전히 다른 범위에 정의 된 변수 ( )에 액세스 할 수 있어야합니다 . 이것이 작동하기 위해 생성되는 메소드는 "참조 환경과 함께 함수"입니다. 기본적으로 변수에 대한 액세스를 검색하기 위해 "클로저"를 생성합니다.

그러나이 람다 :

Action lambda2 = () => { Console.WriteLine("Foo"); }

완전히 포함 된 메서드이기 때문에 "참조 환경"에 의존하지 않습니다. 이 경우 컴파일러는 일반 정적 메서드를 생성하고 전혀 닫히지 않습니다.

두 경우 모두 람다는 delegate( "함수 객체")를 생성하지만 람다는 모든 경우에 참조 환경을 반드시 "캡처"할 필요가 없기 때문에 첫 번째 경우에만 클로저를 생성합니다.


리드의 대답은 정확합니다. 몇 가지 추가 세부 정보 만 추가하겠습니다.

  • 람다 표현식익명 메소드 모두 폐쇄 의미를 가지고; 즉, 외부 변수를 "캡처"하고 해당 변수의 수명을 연장합니다.

  • 익명 함수람다 식 또는 익명 메서드를 의미 할 때 사용하는 용어 입니다. 네, 혼란 스럽습니다. 죄송합니다. 우리가 생각 해낼 수있는 최선이었습니다.

  • 객체로 취급 할 수있는 함수는 대리자입니다. 람다를 클로저 로 만드는 것은 외부 변수를 캡처한다는 것입니다.

  • 식 트리로 변환 된 람다 식도 흥미롭게도 클로저 의미를 가지고 있습니다. 그리고 그것을 올바르게 구현하는 것은 목에 고통 스러웠습니다.

  • "this"는 "this"가 변수가 아니더라도 클로저를 생성 할 목적으로 "외부 변수"로 간주됩니다.


"클로저"가 아니라 "클로저"입니다.

그것은 종결이 아닙니다. 클로저는 기본적으로 함수가 사용하는 비 지역 변수와 함께 함수를 표현한 것입니다.

그런 의미에서 람다는 클로저가 아니지만, 변수가 닫히면 컴파일러가 클로저를 생성합니다.

일부 변수를 닫는 람다가 포함 된 어셈블리에서 ILDASM을 사용하는 경우 해당 어셈블리에서 함수와 닫힌 변수를 나타내는 컴파일러 생성 클래스를 볼 수 있습니다. 입니다 폐쇄.

네가 얘기 할 때

객체로 취급되는 기능,

일반적으로 "함수 개체"(C #에서는 "대리자"라고 함)이며 함수 프로그래밍에서 일반적입니다.


예. 클로저는 일반적으로 외부 범위에서 변수를 캡처합니다. Lambda는 그렇게 할 수 있습니다. 그러나 람다가 아무것도 캡처하지 않으면 클로저가 아닙니다.

참고 URL : https://stackoverflow.com/questions/9591476/are-lambda-expressions-in-c-sharp-closures

반응형