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(например, закрытие для внешней оболочки)? Может ли это быть сделано (или не имеет смысла даже пытаться)?