Захваченные переменные... Что на самом деле означает "Захваченный"?

В "Перехваченных переменных" как фиксируется переменная?

Что означает этот термин "захваченный"?

Означает ли это ссылку на тип значения без вовлечения бокса?

Спасибо

1 ответ

Решение

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

Рассмотрим следующее

void Main()
{
     string s = "hello";
     Action a = delegate 
     { 
          Debug.WriteLine(s);
     };
     s = "hello2";
     a();
} 

В приведенном выше примере строковая переменная s фиксируется встроенным действием a.

Под капотом компилятор C# создаст внутренний класс, на который Action ссылаются, чтобы захватить значение переменной s. Важно отметить, что строка s передается по ссылке на действие a, поэтому действие фактически выведет "hello2", а не "hello". Это может привести к непреднамеренным побочным эффектам, если они не совсем понятны, и называется "доступ к измененному закрытию".

Другие вопросы по тегам