c# - 调用没有参数但使用本地参数的委托(delegate) C#

标签 c# parameters delegates lazy-evaluation

我发现自己经常执行以下操作,我不知道是否有任何副作用,但请在 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/

相关文章:

c# - typeof(interface).IsAssignableFrom(intptr) 返回 true

c# - MVC5/C# : Pass LINQ inner Join query to view model

c# - ASP MVC 4 MySQL,处理事务错误时遇到问题

c# - 如何为泛型类型实现 == 或 >= 运算符

c# - 使用 Func<> 参数将委托(delegate)对象传递给方法

c# - Web 服务传递参数类

C++ 将用户定义的函数传递给另一个函数

zend-framework - 如何使用 Zend 框架从模型中获取请求对象。

ios - 使用 dismissViewControllerAnimated 传回数据

ios - 从另一个 ViewController 访问数组并对其进行排序