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
'Nice programing' 카테고리의 다른 글
현재 디렉터리를 확인할 수 없습니다. (0) | 2020.12.09 |
---|---|
Swift 용 UITableView 예제 (0) | 2020.12.09 |
iOS에서 UIWebView의 배경을 변경할 수 없습니다. (0) | 2020.12.09 |
initWithImage : (UIImage *) image를 사용하여 UIBarButtonItem에 이미지 추가 (0) | 2020.12.09 |
Android의 마키 텍스트 (0) | 2020.12.09 |