Looking for c# Answers? Try Ask4KnowledgeBase
Looking for c# Keywords? Try Ask4Keywords

C# LanguageЛямбда-выражения


замечания

Затворы

Лямбда-выражения будут неявно захватывать используемые переменные и создавать закрытие . Закрытие - это функция, а также некоторый контекст состояния. Компилятор будет генерировать замыкание всякий раз, когда выражение лямбда «окружает» значение из его окружающего контекста.

Например, когда выполняется следующее

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

safeApplyFilterPredicate относится к вновь созданному объекту, который имеет частную ссылку на текущее значение filterer и метод Invoke которого ведет себя как

o => (o != null) && filterer.Predicate(i);

Это может быть важно, потому что до тех пор , как ссылка на значение в настоящее время в safeApplyFilterPredicate поддерживается, будет ссылка на объект , который filterer в настоящее время относится к. Это оказывает влияние на сборке мусора, и может привести к непредсказуемым результатам , если объект , который 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;
};

Лямбда-выражения Связанные примеры