我发现自己经常执行以下操作,我不知道是否有任何副作用,但请在 WinForms C# 应用程序中考虑以下操作。 (请原谅我输入代码时出现的任何错误,而不是复制粘贴任何内容)
int a = 1;
int b = 2;
int c = 3;
this.Invoke((MethodInvoker)delegate()
{
int lol = a + b + c;
});
这有什么问题吗?或者我应该走很长的路>_<
int a = 1;
int b = 2;
int c = 3;
TrippleIntDelegate ffs = new TrippleIntDelegate(delegate(int a_, int b_, int c_)
{
int lol = a_ + b_ + c_;
});
this.Invoke(ffs);
区别在于参数是传入的,而不是使用局部变量,这是一些非常甜蜜的.net 魔法。我想我看过一次反射器,它创建了一个全新的类来保存这些变量。
所以这很重要吗?我可以偷懒吗?
编辑:注意,显然不要关心返回值。否则我必须使用我自己的类型化委托(delegate),尽管我仍然可以使用局部变量而不传递它!
最佳答案
您使用它的方式并没有真正的区别。然而,在第一种情况下,您的匿名方法正在捕获变量,如果您不知道自己在做什么,这可能会产生相当大的副作用。例如:
// No capture :
int a = 1;
Action<int> action = delegate(int a)
{
a = 42; // method parameter a
});
action(a);
Console.WriteLine(a); // 1
// Capture of local variable a :
int a = 1;
Action action = delegate()
{
a = 42; // captured local variable a
};
action();
Console.WriteLine(a); // 42
关于c# - 调用没有参数但使用本地参数的委托(delegate) C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2331134/