事件和委托示例,每一行都有注释

using System;
delegate void CharEventHandler(object source, CharEventArgs e);    //先声明一个委托,object为事件源,XXXXEventArgs由EventArgs(该类用于将数据传给事件)派生而来;
public class CharEventArgs : EventArgs {    //EventArgs派生类格式,就一个构造函数接受一个字符赋给数据成员;
    public char currchar;    //数据成员;
    public CharEventArgs(char CurrChar) {
        this.currchar = CurrChar;    //设置值;
    }
}
class CharChecker {
    char curr_char;
    public event CharEventHandler TestChar;    //创建事件对象;
    public char Curr_Char {    //属性定义;
        get { return curr_char; }
        set {
            if (TestChar != null) {    //TestChar被声明为事件对象,如无对应事件,则为null;
                CharEventArgs args = new CharEventArgs(value);    //CharEventArgs对象包含事件处理程序所需的值;
                TestChar(this, args);    //调用事件代表,其中this为调用事件的对象,args为CharEventArgs对象;
                curr_char = args.currchar;    //将CharEventArgs对象赋值给数据成员(即实现set);
            }
        }
    }
}
class myApp {
    static void Main() {
        CharChecker tester = new CharChecker();    //声明包含事件的对象,其set被调用时,会创建事件对象和引发事件;
        //tester为事件类声明的对象,TestChar为事件类中声明的事件对象,"+="将事件处理程序加入到事件中,Drop_A为事件处理名称,传递给委托CharEventHandler;
        tester.TestChar += new CharEventHandler(Drop_A);
        tester.Curr_Char = 'a';    //set引发事件;
        Console.WriteLine("{0}", tester.Curr_Char);    //get很普通,无事件;
        Console.ReadKey();
    }
    static void Drop_A(object source, CharEventArgs e) {    //事件处理程序,在事件发生时被通知;
        if (e.currchar == 'a' || e.currchar == 'A')
            e.currchar = 'x';
    }
}
原文地址:https://www.cnblogs.com/i124q29/p/3869540.html