我们修改委托,增添一个CarEventArgs参数,就可以传递数据了。(事件不变。)
public delegate void CarEngineHandler(object sender, CarEventArgs args);//定义委托
调用方法:
if (Exploded != null)
{
Exploded(this,new CarEventArgs("Sorry, this car is dead..."));
}
如何接受者想与发送事件的对象交互,我们可以现实强制转换System.Object。这样就可以使用传递给事件通过对象中的任何公共成员。
三、C#匿名方法
匿名方法又是干毛的?
这可真是一波一波的,先是委托解决了函数指针的不安全性,但是后来嫌麻烦,又出现了事件。结果,事件也看起来啰里啰嗦,好吧,匿名方法登场:
上面的注册事件处理程序,被改成了:
c1.AboutToBlow += delegate (object sender,CarEventArgs e)
{
Console.WriteLine("Eek! Going to fast!");
};
看起来似乎是处理和注册声明到一块儿了。
说明:匿名方法中最后一个大括号必须以分好结束,否则,将产生一个编译错误。
下面是匿名方法的语法的伪代码:
匿名方法非常有趣,它使我们能访问定义他们的方法的本地变量。这些变量成为匿名方法的外部变量。有关匿名方法和定义方法的作用域之间的交互,有几个重要的知识点:
匿名方法不能访问定义方法中的ref或out参数。
匿名方法中的本地变量不能与外部方法中的本地变量重名。
匿名方法可以访问外部类作用域中的实例变量(或静态变量)。
四、Lambda表达式
Lambda表达式是干毛用的?好吧,彻底被干败了,觉得匿名方法还麻烦,都把裤子脱了还嫌麻烦,于是就让你比脱了裤子还简单,看我Lambda的吧:
编写:Lambda表达式是这样编写的,首先,定义一个参数列表,“=>”标记紧随其后,然后就是处理这些参数的语句。下面表达式可以说明:
ArgumentsToProcess=>StatementsToProcessThem。
那么用Lambda表达式,如何表达上面的注册处理程序?如下:
c1.AboutToBlow +=(sender,e)=>{ Console.WriteLine("Eek! Going to fast!");//在里面可以处理传入的参数 };
五、小结
这主要讨论了四个东西,其实就是一个,那就是委托,然后优化成事件。然后简化成匿名方法,最后简化成Lambda表达式的过程。