Захваченные переменные... Что на самом деле означает "Захваченный"?
В "Перехваченных переменных" как фиксируется переменная?
Что означает этот термин "захваченный"?
Означает ли это ссылку на тип значения без вовлечения бокса?
Спасибо
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". Это может привести к непреднамеренным побочным эффектам, если они не совсем понятны, и называется "доступ к измененному закрытию".