行动范围参数

时间:2015-08-18 11:00:40

标签: c# wpf scope action

我一直在开发一个WPF应用程序,我偶然发现了一些有趣的东西,可能是因为我不知道它在底层是如何工作的。

基本上我正在创建一个上下文菜单。菜单有一个父MenuItem,它有三个相同类型的子节点。这是裸骨代码。

Public Sub DGV_CellPainting(ByVal sender As Object, ByVal e As DataGridViewCellPaintingEventArgs) Handles DGV.CellPainting
    If e.ColumnIndex = 5 And Not Object.Equals(e.Value, DBNull.Value) Then
        e.PaintBackground(e.CellBounds, False)
        TextRenderer.DrawText(e.Graphics, e.Value, e.CellStyle.Font, e.CellBounds, e.CellStyle.ForeColor, e.CellStyle.BackColor, (TextFormatFlags.Left Or TextFormatFlags.HorizontalCenter Or TextFormatFlags.VerticalCenter) And (Not TextFormatFlags.RightToLeft))
        e.Handled = True
    End If
End Sub

视觉上,它按预期工作。

但我作为参数给出的动作表现得很奇怪。我希望每个子项的单击显示在MessageBox中的标题中写入的内容。但所有这些都显示'3'。

我是否正确理解,我在for循环中定义的内联动作,不会使用相同的参数'i'实例化三次,而只是一次实例化?或者它们是三个不同的Action实例,都是指同一个整数?我想听听有关这里发生了什么的澄清。

提前致谢。 问候。

1 个答案:

答案 0 :(得分:4)

for(int i = 0; i < 3; i++)
{
    var localCopy = i;
    parent.Items.Add(CreateMenuItem(localCopy.ToString(), () => MessageBox.Show(localCopy.ToString())));
}

你的变量我被lambda表达式“捕获”了。但是i在执行您的操作之前已经发生了变化。并且您的操作将在当前i上执行,这意味着3(我在循环之后以及最终执行操作时的值)。

您需要制作变量的本地副本并使用它。因为它在循环中具有自己的范围,所以它永远不会改变。