是否使用动态创建的控件重复Lambda代码?

时间:2014-08-31 13:44:19

标签: c# lambda dynamically-generated

今天我回答了question,基本上是关于UI互动。但后来它让我想到了OP用他们的代码对动态创建的控件进行处理的方式。

错过了.Net 2-4并且现在才开始学习'新'的东西,这实际上是让我在第一时间问题的原因..:

private void AddPieceButton_Click(object sender, EventArgs e)
{
   somePieceControl newPiece = new somePieceControl ();
   //..
   newPiece.MouseDown += (sender2, evt) =>  { /* 1st block of code */ };
   newPiece.MouseUp   += (sender2, evt) =>  { /* 2nd block of code */ };
   newPiece.MouseMove += (sender2, evt) =>  { /* 3rd block of code */ }
   //..
   someContainer.Controls.Add(newPiece);
}

在测试案例中,问题几乎不重要;但代码块可以很容易地获得更多,更大;在像Go这样的游戏中,最终会有数百个游戏棋子。

虽然人们可能/可能并且应该质疑添加这么多控件的想法,但是询问的人仍然想知道......:每个部件都有自己的那些代码块的副本,因为我猜它有或者它们被排除在外在我们的世界中,像正常事件一样奇迹,只在运行时记忆中活一次?

2 个答案:

答案 0 :(得分:5)

每个lambda都被转换为" normal"编译时的方法,因此lambas的实际代码不会重复。但是,每次运行此方法时,都将实例化引用代码的新EventHandler委托。

答案 1 :(得分:2)

正如Michael Liu所说,使用lambdas没有额外的内存开销。但是你需要知道闭包,它存储对非局部变量的引用(我的意思是,在lambda的外部范围内)。使用闭包时甚至可能会出现内存泄漏。

事件处理程序怎么样?通过在父元素\容器上使用事件路由,您可以轻松地消除其他事件处理程序(如果您使用的是基于XAML的UI框架)。