早些学C#时对委托和事件的理解笔记

1、C#中的委托相似于C的函数指针,更如同C++中的引用,可以看成对函数的引用,对应C++中对变量的引用。但在C#中的实际使用方式却更像一个类。
2、可以生成一个指向具有相同函数签名的委托实例,此时调用此委托实例的效果与调用所指向的函数的效果相同。
3、可能对一个委托引用变量使用“=”赋值使其只指向一个委托实例,也可以用“+=”与“-=”接受、去除委托实例。
4、若定义委托变量的时候再加event关键字,就可定义一个特殊的委托变量,即事件。此时此委托变量只能以+=方式接受委托实例(每个委托实例指向一个函数),也只能以-=方式去掉所拥有的委托实例。
5、当某一个事件被触发时,只要程序员通过+=方式给它处理函数,则这些处理函数在此事件触发时会自动调用。
6、C#是通过+=方式给事件增加处理函数的办法来达到处理事件的目的。而在JAVA里,当事件被触发时,此事件会自动传递给对应的监听器接口,所以只要实现此监听器接口的类,就能达到处理此事件的目的。
7、如果要手动实现执行处理函数(C#中)或监听器(JAVA中),C#中只要以调用函数的方式调用此事件就行,而JAVA中得把一个事件传递给一个监听器接口(然后系统才会自动执行此监听器接口中的所有方法)才行。
8、MSDN中阐述了C#与JAVA对事件的不同:“与 Java 中的事件处理(通过实现自定义侦听器类执行)不同,C# 开发人员可以使用委托进行事件处理。”
9、一般定义一个事件处理函数时无返回值,因为即使有返回值,通过调用事件来达到执行相应的所有事件处理函数后,此事件所返回的只有最后被执行的事件处理函数的返回值。
10、可以定义一个委托类型的临时变量(在函数中),但不能定义一个事件类型的临时变量。可以定义一个事件类型的类成员变量。

例:
public delegate void EventHandler(object sender, Event e);
public class Button
{
    public event EventHandler Click;
    public void Reset()
    {
        Click = null;
    }
}

public class Form1
{
    public Form1()
    { // Add Button1_Click as an event handler for Button1’s Click event
        Button1.Click += new EventHandler(Button1_Click);
    }
    Button Button1 = new Button();
    void Button1_Click(object sender, Event e)
    {
        Console.WriteLine("Button1 was clicked!");
    }
    public void Disconnect()
    {
        Button1.Click -= new EventHandler(Button1_Click);
    }
}

发布了13 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xsff1024/article/details/2854919
今日推荐