C#委托和事件理解

从实际应用出发来理解C#的委托和事件比较容易些。而WinForm编程是大家比较熟悉的东西了,我们就从WinForm编程来理解C#的委托和事件。新建一个Windows工程,添加一个按钮控件和一个文本框控件,实现的功能就是点击按钮的时候,文本框中显示“OK”。效果图如下所示:


这个很容易实现。所有接触C#的程序员都会这个。现在我们根据这个简单的应用,分析一下背后关于委托和事件的实现和意义。
这样吧,我们还按照控制台应用程序的习惯,从static void Main()开始分析。如下所示:

static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }


这里都不陌生,这个Program类是系统自己建立的,其中包含的就是静态函数static void Main()。函数中最后一句Application.Run(new Form1())就是系统要开始执行窗体方法Form1()。这里的Form1就是刚才我们新建的一个窗体类,具体代码如下所示:

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "OK";
        }
    }


这段代码说明,这个Form1是系统帮我们建立的一个新的类,继承于系统的Form类。其中Form1(),也就是上面Application.Run(new Form1())中的Form1(),就是这个新类的构造函数,下面我们继续沿着刚才的程序的执行流程,接着往下看Form1()的内容,也就是InitializeComponent()。具体函数体如下所示:

 private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(97, 158);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(84, 83);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(100, 25);
            this.textBox1.TabIndex = 1;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(282, 255);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1 ";
            this.ResumeLayout(false);
            this.PerformLayout();
   }

这个函数是系统自己生成的,条理很清晰。这里可以很明显的看出一共有3个控件,分别是button1,textBox1和Form1。其中每个控件执行的代码大都是对控件属性的操作。在这里我们注意到一句代码:

this.button1.Click += new System.EventHandler(this.button1_Click);

这句代码的意思就是将this.button1_Click方法注册到this.button1.Click事件里。这句话看来简单,却蕴含着3个主要的内容:

 第一:使用了委托System.EventHandler。那么我们看看,这种委托类型(抽象性概念)是在哪里声明的:

namespace System
{
    // Summary:
    //     Represents the method that will handle an event that has no event data.
    //
    // Parameters:
    //   sender:
    //     The source of the event.
    //
    //   e:
    //     An System.EventArgs that contains no event data.
    [Serializable]
    [ComVisible(true)]
    public delegate void EventHandler(object sender, EventArgs e);
}



可以看出,这种委托类型是在System命名空间下声明的,也就是说,是系统自己本来就有的。

第二:使用了事件Click。我们继续看看,这个事件(具体性概念)是在哪里定义的。

        //
        // Summary:
        //     Occurs when the control is clicked.
        public event EventHandler Click;


在命名空间System.Windows.Forms的Control类下,我们发现了它:Public event EventHandler Click,这个就是个Click事件,即当点击事件发生的时候,就会用到EventHandler这种类型的委托。意思就是:当这个Click事件发生时,响应事件的工作是通过EventHandler 这个委托代理的方法实现的,而且必须只能用这种委托代理的方法实现,这点也是委托和事件的机制。

第三:委托代理的方法,即当button1这个对象(或者叫做实例)的Click事件发生时(是用户点击了这个button1),就会立刻调用委托代理的方法,即调用响应事件的方法,也就是括号中的this.button1_Click方法。那么这个方法在哪里呢?继续往下看:

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "OK";
        }
    }



就在这里(其实这段代码前面贴过,目的是为了分析Form1())。看到这里应该清晰了,这段代码的框架是系统自己生成的,里面的内容你用户自己填写的,即说明了关键一点:系统添加了按钮控件,并将点击当前按钮控件的处理方法注册到当前按钮的Click事件列表中,最后响应Click事件的代码让用户自己根据需要添加。

那么,这样做有什么好处呢?其实分析到这里,优点显而易见了。每个用户希望点击按钮后的反应都不尽相同,例如程序员A希望文本框显示“OK”,程序员B希望弹出确认消息框。这样的话每个程序员都可以根据自己需要添加自己的代码,从而增加了软件设计的灵活性,也提高了系统的可扩展性。

以上是在窗体设计过程中委托和事件的体现,我们利用窗体来进行windows编程的时候体会不到其实系统帮我们做了很多事情,但是我们一定要分析内部的机制,这样我们才能在实际的项目中灵活的进行设计。任何技术都是这样,只有洞悉本质才能做到灵活运用。

至此,2012年7月12日,12:33。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值