C# Lambda代码是否与动态创建的控件重复?

C# Lambda代码是否与动态创建的控件重复?,c#,lambda,dynamically-generated,C#,Lambda,Dynamically Generated,今天我回答了一个关于UI交互的问题。但后来我开始思考OP是如何用代码动态创建控件的 错过了.Net 2-4,直到现在才开始学习“新”东西,这实际上是让我首先想到这个问题的原因 private void AddPieceButton_Click(object sender, EventArgs e) { somePieceControl newPiece = new somePieceControl (); //.. newPiece.MouseDown += (sender2,

今天我回答了一个关于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);
}
在测试案例中,问题几乎无关紧要;但是代码块很容易变得越来越大;同样,在像围棋这样的游戏中,最终会有数百个棋子


虽然人们可能会/可能会&应该质疑添加这么多控件的想法,但好奇的头脑仍然想知道:每一块代码都有自己的代码块副本吗?或者它们是否像正常事件一样在我们奇妙的世界中被分解,只在运行时内存中存在一次?

每个lambda都会被转换成一个“正常方法,因此lambas的实际代码不会重复。但是,每次运行此方法时,引用代码的新EventHandler委托都将被实例化。

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


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

感谢您的提示。我将明确地研究闭包。示例中lambda都是标准事件的情况是什么?是否存在可能的问题?至于事件路由:我相信OP是在Winforms中。抱歉,没有看到控件。Add():)如果这些lambda不使用任何外部范围变量,比如newPiece,那么就不会有问题。