今天一朋友问到一问题,怎么在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);};
}
这样代码简单,而且空间不浪费。