委托传参,lambda

今天一朋友问到一问题,怎么在timer的委托里面传参数,我初一想Invoke

可以传参数吧,我就说了。 后来他说这个委托是微软定义,不能变参数,于是我就自己写了一段代码试

试. 我最初写的代码如下

    public class A
    {
        public string p = string.Empty;
        public void foo(object sender, System.Timers.ElapsedEventArgs e)
        {
            B.foo(p);
        }
    }

  然后在循环里 为A的对象传参数

            string[] a = { "a", "b", "c" };

            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Interval = 1000;


            foreach (string s in a)
            {
                A aaa = new A();
                aaa.p = s;
                timer.Elapsed += aaa.foo;
            }
            timer.Start();

  

这样是实现了效果,但是我不是很爽,因为如果我很多参数,那我不是要创

建很多A的对象,如果A中还有其它的数据,那是否是浪费空间呢?

后在我修改了一个版本,如下

    public static class B
    {
        public static void foo(string s)
        {
            Console.WriteLine(s);
        }
    }

这个是要接受参数运行的方法

调用的地方就用lambda表达式实现变量,参数穿越效果,

            foreach (string s in a)
            {
                timer.Elapsed +=(sender,e)=>{B.foo(s);};
            }

  这样代码简单,而且空间不浪费。

原文地址:https://www.cnblogs.com/gw2010/p/3443267.html