委托与事件

2012年3月12日 天气阴  蛋疼的一天

为什么有委托

希望能够调用一个函数,但是写程序的时候不用知道调用的是哪个函数,只要能传参数,取返回值就可以。

委托的使用


声明委托的方式:delegate 返回值类型 委托类型名(参数)

比如delegatevoid StringProcess(string s);

注意这里的除了前面的delegate,剩下部分和声明一个函数一样,但是StringProcess不是函数名,而是委托类型名

声明的委托是一种类型,就像int、Person一样,如果要用的话还要声明委托类型的变量,声明委托类型变量的方式:StringProcessf1;

将委托类型变量指向函数StringProcess sp = newStringProcess(SayHello),这样就可以像调用普通函数一样把sp当成函数用了。委托可以看做是函数的指针。整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它。和直接调用函数的区别:用委托就可以指向任意的函数,哪怕是之前没定义的都可以,而不使用受限于那几种。

将委托类型变量指向函数还可以简化成StringProcess sp = SayHello,编译器帮我们进行了new。但是不能sp=PrintIt(),因为这样就成了“执行PrintIt函数,并且将sp指向PrintIt的返回值”。

事件注意:

事件语法:event ProcessWordDelegate{add{...},remove{...}}add、remove和属性、索引一样最终都编译成两个方法。

如果是简单的增加委托,没有特殊的判断逻辑可以简写,一般情况下都是简写。

加了event关键字实现事件机制的好处:用了event事件,不可以修改事件已经注册的值;不可以冒充进行事件通知了。在IntUC类外部就不能通过OnInt(3)的方式调用注册的委托了。只能+=、-=!

委托测试:

建立一个windows应用程序

创建一个用户控件,代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 委托事件验证控件
{
    public partial class shanqiangControl : UserControl
    {
        private int Count=0;
        //定义委托对象
        private shanqianDelegate shanqian;
        public void AddshanqianEvents(shanqianDelegate v)
        {
            shanqian += v;
        }
        //用事件操作委托,用add,remove和上面定义的私有委托变量混合用
        //public event shanqianDelegate shanqian1
        //{
        //    add
        //    {
        //        shanqian += value;
        //    }
        //    remove
        //    {
        //        shanqian -= value;
        //    }
        //}

        //也可以不用add,remove
        public event shanqianDelegate shanqian1;
        public shanqiangControl()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Count++;
            if (Count == 3)
            {
                Count = 0;
                //用add,remove方法的调用这个委托变量
                //if (shanqian != null)
                //{
                //    shanqian();
                //}
                //不用add,remove方法者,直接用事件操作
                if (shanqian1 != null)
                {
                    shanqian1();
                }
            }
        }
    }
    //定义委托
    public delegate void shanqianDelegate();
}

在form中调用,代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 委托事件验证控件
{
    public partial class Form1 : Form
    {
        public Form1()
        {

            InitializeComponent();
            validateText1.validate = validateUser;
            //通过委托添加删除方法
            //shanqiangControl1.AddshanqianEvents(onshanqian);

            //通过事件添加删除方法
            shanqiangControl1.shanqian1 += onshanqian;
        }


        void onshanqian()
        {
          //  testc();
            MessageBox.Show("bingo!!");
        }


    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值