수색…


비고

마감

람다 식은 사용 된 변수 를 암시 적으로 포착하고 클로저를 만듭니다 . 클로저는 일부 상태 컨텍스트와 함께 함수입니다. 컴파일러는 람다식이 주변 컨텍스트의 값을 '둘러 쌉니다'때마다 클로저를 생성합니다.

예 : 다음과 같이 실행될 때

Func<object, bool> safeApplyFiltererPredicate = o => (o != null) && filterer.Predicate(i);

safeApplyFilterPredicatefilterer 의 현재 값에 대한 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>>


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow