如何在C#中正确使用lambda表达式的参数?

时间:2017-01-22 14:55:31

标签: c# c#-4.0 lambda parameters

我想知道,如果我在以下短代码片段中正确使用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();
}

4 个答案:

答案 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 var1var2由值参数传递,这些参数只能在本地更改。因此,如果您不在var3内更改它们,那么您就可以了。

要了解捕获值或变量之间的区别,请考虑以下代码段:

Extern_Func

你能猜出输出吗?