参考:http://stackoverflow.com/questions/803242/understanding-events-and-event-handlers-in-c-sharp
事件基于委托,为委托提供了一种发布/订阅机制。
委托
定义委托,就是告诉编译器这种类型的委托表示哪种类型的方法。然后必创建该委托的一个或多个实例。其语法类似于方法的定义,但没有方法体,定义前面要加上关键字delegate.委托在语法上总是的接受一个参数的构造函数,这个参数就是委托引用的方法。这个方法必须匹配最初定义委托时的签名。
private delegate string GetAString();
static void Main()
{
int x=40;
GetAString firstStringMethod=new GetAstring(x.ToString);
Console.WriteLine(firstStringMethod());
}
firstStringMethod()等价于firstStringMethod.Invoke()
GetAString firstStringMethod = new GetAString(x.ToString);
等价于
GetAstring firstStringMethod = x.ToString;
事件
当系统中发生了一些事情时,我们想能调用一些代码来执行或者称为处理事件。我们把这些要调用的代码创建为函数,在事件与函数之间我们使用委托机制,在这种机制里,事件需要有一个存储函数的列表。
而我们定义一个EventHandler时,实际上是在定义函数的外形。定义一个event时,实际是在说明这个事件会invoke哪类的EventHandler。最后EventHandler通过委托来添加实际的事件处理函数。
示例代码
//This delegate can be used to point to methods
//which return void and take a string.
public delegate void MyEventHandler(string foo);
//This event can cause any method which conforms
//to MyEventHandler to be called.
public event MyEventHandler SomethingHappened;
//Here is some code I want to be executed
//when SomethingHappened fires.
void HandleSomethingHappened(string foo)
{
//Do some stuff
}
//I am creating a delegate (pointer) to HandleSomethingHappened
//and adding it to SomethingHappened's list of "Event Handlers".
myObj.SomethingHappened += new MyEventHandler(HandleSomethingHappened);
通过sender=null,e=null可以手动调用事件处理函数。
EventHandler委托
表示将处理不包含事件数据的事件的方法表示将处理不包含事件数据的事件的方法。
[SerializableAttribute]
[ComVisibleAttribute(true)]
public delegate void EventHandler(
Object sender,
EventArgs e
)
-
sender
类型:System.Object
事件源
e
类型:System.EventArgs
不包含事件数据的对象
ScrollEventHandler委托
表示处理DataGridView\ScrollBar\TrackBar或DataGrid的Scroll事件的方法
-
类型:
System.Object
事件源。
-
类型:
System.Windows.Forms.ScrollEventArgs
包含事件数据的 ScrollEventArgs。
public delegate void ScrollEventHandler(
Object sender,
ScrollEventArgs e
)
-
sender
-
e