수색…
비고
마감
람다 식은 사용 된 변수 를 암시 적으로 포착하고 클로저를 만듭니다 . 클로저는 일부 상태 컨텍스트와 함께 함수입니다. 컴파일러는 람다식이 주변 컨텍스트의 값을 '둘러 쌉니다'때마다 클로저를 생성합니다.
예 : 다음과 같이 실행될 때
Func<object, bool> safeApplyFiltererPredicate = o => (o != null) && filterer.Predicate(i);
safeApplyFilterPredicate
는 filterer
의 현재 값에 대한 private 참조를 가지고 있고 Invoke
메소드가 다음과 같이 작동하는 새로 생성 된 객체를 참조합니다.
o => (o != null) && filterer.Predicate(i);
safeApplyFilterPredicate
에있는 값에 대한 참조가 유지되는 한, 현재 filterer
가 참조하는 객체에 대한 참조가 있기 때문에 중요 할 수 있습니다. 이것은 garbage collection에 영향을 filterer
현재 참조하고있는 객체가 변경되면 예기치 않은 동작을 일으킬 수 있습니다.
한편 클로저는 다른 객체에 대한 참조를 포함하는 동작을 캡슐화하기 위해 효과를 심의하는 데 사용할 수 있습니다.
예 :
var logger = new Logger();
Func<int, int> Add1AndLog = i => {
logger.Log("adding 1 to " + i);
return (i + 1);
};
클로저를 사용하여 상태 시스템을 모델링 할 수도 있습니다.
Func<int, int> MyAddingMachine() {
var i = 0;
return x => i += x;
};
기본 람다 식
Func<int, int> add1 = i => i + 1;
Func<int, int, int> add = (i, j) => i + j;
// Behaviourally equivalent to:
int Add1(int i)
{
return i + 1;
}
int Add(int i, int j)
{
return i + j;
}
...
Console.WriteLine(add1(42)); //43
Console.WriteLine(Add1(42)); //43
Console.WriteLine(add(100, 250)); //350
Console.WriteLine(Add(100, 250)); //350
LINQ를 사용한 기본 람다 식
// assume source is {0, 1, 2, ..., 10}
var evens = source.Where(n => n%2 == 0);
// evens = {0, 2, 4, ... 10}
var strings = source.Select(n => n.ToString());
// strings = {"0", "1", ..., "10"}
람다 구문을 사용하여 클로저 만들기
종결에 대한 논의는 비고문을 참조하십시오. 인터페이스가 있다고 가정 해보십시오.
public interface IMachine<TState, TInput>
{
TState State { get; }
public void Input(TInput input);
}
다음이 실행됩니다.
IMachine<int, int> machine = ...;
Func<int, int> machineClosure = i => {
machine.Input(i);
return machine.State;
};
지금 machineClosure
에서 함수를 의미 int
하는 int
뒤에서 사용 IMachine
인스턴스 machine
계산을 수행하기 위해 지칭한다. 참조 machine
가 범위를 벗어나 machineClosure
객체가 유지되는 한 원래 IMachine
인스턴스는 컴파일러에서 자동으로 정의하는 '폐쇄'의 일부로 유지됩니다.
경고 : 이것은 동일한 함수 호출이 다른 시간에 다른 값을 반환한다는 것을 의미 할 수 있습니다 (예 : 기계가 입력의 합계를 유지하는 경우). 많은 경우에 예상치 못한 기능 스타일의 코드는 피할 수 있습니다. 예기치 않은 예기치 못한 종료가 버그의 원인이 될 수 있습니다.
문 블록 본문이있는 람다 구문
Func<int, string> doubleThenAddElevenThenQuote = i => {
var doubled = 2 * i;
var addedEleven = 11 + doubled;
return $"'{addedEleven}'";
};
System.Linq.Expressions의 람다 식
Expression<Func<int, bool>> checkEvenExpression = i => i%2 == 0;
// lambda expression is automatically converted to an Expression<Func<int, bool>>