我个人的理解就是 委托里放着 要传递的方法,一个或者多个方法。一开始并不知道要执行什么方法,所以把方法当做参数传递。委托里的方法可以是私有的也可以是静态的。如果委托的方法用到了外部的变量就叫做闭包。如果在foreach中每次方法传递每次的迭代的变量,也不会出现错误,因为C#5.0中自己会创建不同的变量。事件就是为委托提供了一种订阅机制,就是如果这个事件发生了,就会把委托中的方法都执行一遍,通知所以已经订阅者。委托里的多个方法的执行顺序是不可选择的。
using System;
namespace Wrox
{
public class MainEntryPoint
{
static int Main(string[] args)
{
var dealer = new CarDealer();
var michael = new Consumer("Michael");
dealer.NewCarInfo += michael.newCarIsHere;
var july = new Consumer("July");
dealer.NewCarInfo += july.newCarIsHere;
dealer.NewCar("first");
dealer.NewCarInfo -=michael.newCarIsHere;
dealer.NewCar("second");
return 0;
}
public class Consumer
{
private string name;
public Consumer(string name)
{
this.name = name;
}
public void newCarIsHere(object sender, CarInfoEventArgs e)//这个方法是通知该车主一辆什么车到达了
{
Console.WriteLine("{0}: car {1} is new",name,e.Car);
}
}
public class CarInfoEventArgs : EventArgs
{
public CarInfoEventArgs(string car)
{
this.Car = car;
}
public string Car{ get; private set;}
}
public class CarDealer
{
public event EventHandler<CarInfoEventArgs> NewCarInfo;//委托
public void NewCar(string car)
{
Console.WriteLine("CarDealer,new Car {0}",car);
RaiseNewCarInfo(car);//当这个事件发生了 将把委托全部执行一遍 也就是通知所有的订阅者 这件事发生了
}
public virtual void RaiseNewCarInfo(string car)
{
EventHandler<CarInfoEventArgs> newCarInfo = NewCarInfo;
if(newCarInfo != null)
{
newCarInfo(this,new CarInfoEventArgs(car));
}
}
}
}
}