我想知道,如果我在以下短代码片段中正确使用Lambda表达式?我希望随着时间的推移存储函数调用,然后在 Update_Calls()中一起执行它们。最重要的是,我问的是参数 var1-3 是否保留了它们的值(在任何情况下调用 Extern_Func()时的值)?
static List<Action> callsForUpdate = new List<Action>();
public static void Extern_Func(int var1, int var2, float var3)
{
Action callToStore = () => Func(var1, var2, var3);
// Remember in call list
callsForUpdate.Add(callToStore);
}
public static void Update_Calls()
{
for (int i = 0; i < callsForUpdate.Count; i++)
{
callsForUpdate.ElementAt(i);
}
callsForUpdate.Clear();
}
答案 0 :(得分:3)
是。他们将被保留。您的Update_Calls存在问题。
public static void Update_Calls()
{
for (int i = 0; i < callsForUpdate.Count; i++)
{
callsForUpdate.ElementAt(i)();
}
callsForUpdate.Clear();
}
你只是指这个元素。不称呼它。
答案 1 :(得分:1)
您正在创建的内容称为Closure,这意味着将使用Action
的当前值调用var1, var2, var3
,在这种情况下,它们是Extern_Func
的局部变量,所以除非你用这种方法改变它们(Extern_Func
)它们会保持它们的价值。
答案 2 :(得分:1)
您正在做的是创建一个callForUpdate列表中每个项目指向的表达式。表达式是不可变的。为了更改表达式中提供的值,必须用具有新值的新表达式替换表达式。
我对你所询问的内容的最佳估计对大多数情况都是正确的,因为你的列表只是一个表达式列表,用Etern_Func创建它们时提供的值来执行。
答案 3 :(得分:1)
闭包捕获变量,而不是值。确保清楚。
在您的情况下,list_of_magicians[index] = "The Great " + magician
,var1
和var2
由值参数传递,这些参数只能在本地更改。因此,如果您不在var3
内更改它们,那么您就可以了。
要了解捕获值或变量之间的区别,请考虑以下代码段:
Extern_Func
你能猜出输出吗?