Допустим, у меня есть следующее:
class A
{
T x;
Func<T> f;
A()
{
f = () => x;
}
void SetX(T blah)
{
x = blah;
}
}
Всегда ли верно, что f() == x.
то есть после вызова SetX(y), верно ли, что f() == x == y?
(Обратите внимание, если это отличается для значений и ссылочных типов)
В более широком смысле, есть ли какая-то информация, которую я могу прочитать (или разместить в ответе) о том, оцениваются ли аргументы лямбда при создании лямбда или при выполнении лямбда? Я мог бы просто проверить эти случаи, но мне нужен материал для чтения, чтобы я понял, как это работает, поэтому у меня меньше шансов получить какие-либо ошибки в будущем.
@kristianp: я не понимаю вашего комментария. Во-первых, доступность по умолчанию для члена класса — private, поэтому вообще не объявлять доступность — это то же самое, что объявить ее private. Но, во-вторых, имя класса — A, поэтому метод с именем A() является конструктором и может быть выполнен только один раз. Пример кода мог бы быть более понятным, но там нет ничего, что указывало бы на то, что значение f может измениться после создания объекта. В любом случае, это не имело бы большого значения для вопроса.





Вместо «лямбда-аргументов» (эта лямбда не имеет параметров) вы, вероятно, имеете в виду «переменные, захваченные лямбдой», и вы спрашиваете, захватываются ли переменные по значению (поэтому он запоминает значение во время создания лямбда) или по ссылке (так что это относится к значению переменной во время запуска лямбды).
В этом случае x является переменной экземпляра, поэтому доступ к x неявно означает this.x, поэтому «локальная переменная», которую лямбда действительно захватывает, — это this (неявная this внутри конструктора A). Замыкания C# захватывают переменные по ссылке (и это верно для всех типов переменных), но в этом случае, поскольку this не может быть присвоено, не имеет значения, захватывается ли оно по значению или по ссылке.
Что произошло, когда вы попробовали это? Ваше «в более широком смысле» - это вопрос не по теме (с просьбой о сторонних ресурсах). Ваш первоначальный вопрос тривиально решается простым запуском кода и просмотром того, что происходит.