A (еще??) вопрос о том, как применяется переменная область применительно к закрытию. Вот минимальный пример:
public class Foo
{
public string name;
public Foo(string name)
{
this.name = name;
}
}
public class Program
{
static Action getAction(Foo obj)
{
return () => Console.WriteLine(obj.name);
}
static void Main(string[] args)
{
Foo obj1 = new Foo("x1");
Action a = getAction(obj1);
obj1 = new Foo("x2");
a();
}
}
Отпечатает x1
. Это можно объяснить следующим образом:
getAction
возвращает анонимную функцию с закрытием, включающим переменную obj
. obj
имеет то же значение ссылки, что и obj1
, но его связь с obj1
заканчивается там, так как замыкание охватывает только obj
. Другими словами, любое значение obj1
после этого не влияет на закрытие. Поэтому всякий раз, когда вы вызываете (однако a
) (например, a
передается какой-либо другой функции), он всегда печатает x1
.
Теперь мои вопросы:
- Правильно ли указано это выше?
- У меня нет конкретного сценария, но что, если мы хотим, чтобы программа печатала
x2
(например, закрытие для внешней оболочки)? Может ли это быть сделано (или не имеет смысла даже пытаться)?