Подтвердить что ты не робот

Должен ли я беспокоиться о "доступе к модифицированному закрытию" в запросах linq?

У меня есть запрос linq, который показывает ошибку:

alt text

Я вижу эту ошибку каждый раз, когда пытаюсь получить доступ к переменной, которую я выполняю, если источником коллекции является запрос linq. Думаю, эта ошибка просто говорит мне, что переменная может измениться или что-то в этом роде?

4b9b3361

Ответ 1

Эта ошибка говорит вам, что ссылка на pubConfig внутри вашего запроса будет использовать значение pubConfig во время оценки запроса, а не в то время, когда вы его определяете и сохраняете в pubConfigSettings.

В практическом плане вы будете в порядке, если запрос будет оцениваться "на месте". Если вы сохраните его для последующей оценки, а значение pubConfig изменится тем временем, вы столкнетесь с неожиданными результатами.

Ответ 2

Вы закрываете переменную цикла, которая считается вредной. Запрос ссылается на переменную, а не на значение, которое имела переменная при создании запроса. Неясно, не вызовет ли вас проблемы в вашем конкретном примере кода (это зависит от того, что вы делаете с запросом, который вы создали), но в целом вам следует избегать этого, потому что это может вызвать проблемы с отладкой.

Простое решение - взять копию переменной цикла, прежде чем ссылаться на нее в вашем запросе.

foreach (var pubConfig in ...)
{
    var pubConfig2 = pubConfig;
    // Use pubConfig2 instead of pubConfig in the query.
}

Ответ 3

Это не проблема, если переменная не изменяется в течение всего времени жизни лямбда.

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

Чтобы избавиться от предупреждения, вы можете создать переменную во внутренней области, копируя переменную из внешней области и использовать ее в лямбда.