清风徐来
Michael's Blog
Visual C# 中的事件及委托

visual-studio-logo-800x450.png

在传统的程式设计语言中,事件一般是一种回调。在C#中这种回调被称为委托,事件处理不过是通过委托呼叫方法。

委托类别定义一个方法签名,可将相容签名的方法与委托相关联。

C#中事件采用发布/订阅模型,订阅事件其实就是用委托来实现的。

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            var timer = new System.Timers.Timer(1000);
            timer.Start();
            timer.Elapsed += new System.Timers.ElapsedEventHandler(TimerElapsedHandler);

        }

        void TimerElapsedHandler(object sender, EventArgs e)
        {
            MessageBox.Show("Timer has Elapsed");
        }
    }
}

第一个参数 sender 表示引发实践的物件;第二个参数 e 是传说的数据,类别是 EventArgs 或其子类。事件处理方法返回值 void。

其实委托关联可以简写为timer.Elapsed += TimerElapsedHandler;,取消事件订阅timer.Elapsed -= TimerElapsedHandler;

匿名委托更为简洁,但是取消订阅不好处理,这里不作展开。

2017年09月11日 更新一下匿名的两张写法:

timer.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e)
{
    MessageBox.Show("Timer has Elapsed");
};

或是直接次采用剪头语法来写

timer.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) =>
{
    MessageBox.Show("Timer has Elapsed.");
};

最后修改于 2017-09-09