gpt4 book ai didi

c# - Action 参数范围

转载 作者:行者123 更新时间:2023-11-30 20:41:45 25 4
gpt4 key购买 nike

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

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

public MainWindow()
{
InitializeComponent();

ContextMenu ctxMain = new ContextMenu();

MenuItem parent = CreateMenuItem("Parent", null);

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

ctxMain.Items.Add(parent);
this.ContextMenu = ctxMain;
}


public MenuItem CreateMenuItem(string header, Action action)
{
MenuItem item = new MenuItem();
if (action != null)
{
item.Click += (object sender, RoutedEventArgs e) => action();
}
item.Header = header;
return item;
}

从视觉上看,它按预期工作。

但是我作为参数给出的 Action 表现得很奇怪。我希望每个子项的单击都能在 MessageBox 中显示其标题中所写的内容。但它们都显示“3”。

我是否理解正确,我在 for 循环中定义的内联操作不会实例化三次,而只会实例化一次,使用相同的参数“i”?或者它们是三个不同的 Action 实例,都引用同一个整数?我想听听对这里发生的事情的一些澄清。

提前致谢。问候。

最佳答案

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

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

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

关于c# - Action 参数范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32070568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com