Являются этими примерами закрытия C#?

// In one line:
return (a != 1) && ((b-a-p == 0) || (b-a-p > 1))

// Expanded for the compiler:
if(a == 1)
    return false;

int bap = b - a - p;

return (bap == 0) || (bap > 1);

при регистрации процессора Вы используете, я могу оптимизировать для блока. =]

13
задан tuinstoel 23 October 2009 в 08:31
поделиться

3 ответа

Да, замыкание - это не что иное, как функция, которая «сохраняет» некоторые переменные из среды, в которой она определена. Таким образом, в обоих ваших примерах определенное действие сохраняет список с именем subFolders , на который могут ссылаться функции даже после того, как локальная переменная выходит за пределы области видимости. Переменная фильтра во втором примере также сохраняется определенной функцией.

Более точное определение здесь

6
ответ дан 2 December 2019 в 00:18
поделиться

Во втором примере используется замыканий (технически можно сказать, что компилятор вычисляет замыкание в обоих случаях, но вы не используете его в первом случае).

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

Но когда мы говорим об "использовании замыканий", мы обычно имеем в виду, что лямбда-выражения могут использовать все локальные переменные, видимые в том месте, где они объявлены. Все они являются частью его закрытия.

В вашем случае d - это просто параметр лямбда-функции, и, поскольку это все, что вы используете в первом случае, вы на самом деле не пользуетесь замыканий.

Во втором случае фильтр не определен в лямбда-выражении, это не параметр или что-то еще. Это локальная переменная, которая оказывается видимой в том месте, где объявлена ​​лямбда. Таким образом, это часть замыкания лямбды, что позволяет вам ссылаться на него в теле лямбды.

Править
Как указано в комментариях, я не сделал этого. не читайте ваш код слишком внимательно. Я заметил только второе лямбда-выражение в каждом примере. Первая лямбда-выражение действительно использует замыкания (в обоих случаях она закрывает вложенных папок ).

9
ответ дан 2 December 2019 в 00:18
поделиться

В обоих примерах есть замыкания. В "A" анонимный метод захватывает вложенные папки локальных переменных. В "B" анонимный метод захватывает локальные переменные subFolders и filter. Также посмотрите здесь .

PS Также обратите внимание, что вы фактически используете закрытие в «A», потому что вы используете переменную subFolders.

0
ответ дан 2 December 2019 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: