事件与委托的区别就是“+=”和“-="?

什么是事件?

事件(通过委托实现的,委托才是事件能正常执行的核心内容)

 

事件的作用:

事件的作用与委托变量一样,只是功能上比委托变量有更多的限制。(比如:1.只能通过+=或 -= 来绑定方法(事件处理程序)2.只能在类内部调用(触发)事件。)

事件语法:public event Mydel _mdl;

本实验步骤:(明白事件与委托的区别,先用委托来实现!)

1、添加WebForm窗体

2、自己定义一个控件(项目右键,添加,用户控件,托Button控件进来)

3、声明变量i=0;

4、点击按钮“三连击”写代码,记得i==3的时候要清0

5F6启动生成!

6、回到窗体Form1.拖进来userClick控件,生成项目!

总结:这样不好,方法写死,点击事件的方法写死。我想要点击这个按钮还可以用于其他的功能,,用委托实现!!!

 

7.改进:

8、在userClick这个类中,定义委托 MyDel...在单击事件这个方法上写上委托字段,接收方法变量。

9、写完毕,点击F6,启动生成!

10、运行,此时,发现,点击”三连击“按钮,没有了任何的反应,因为委托中的方法是空的;;

11、双击Form1进入窗体加载的事件,,对委托中进行赋值方法,调用方法(写你想要的方法)

12、写方法;

 

13、下面接着添加一个普通的按钮,

    private void button1_Click(object sender, EventArgs e)

            {

                      userClick1._mdl();//此时,发现,使用不是很安全,因为可以被其他的点击事件直接调用

                   }

 

 

 

Form1代码:

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

namespace 三连击

{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }


        private void Form1_Load(object sender, EventArgs e)

        {

            //userClick1._mdl = Show;   //窗体加载的时候。我要给这个按钮做什么。我就给它赋值一个方法名字就行了

            userClick1._mdl = Do;

        }

        public void Show()

        {
            MessageBox.Show("不错,就是这样!");

        }
        public void Do()
        {
            MessageBox.Show("人性!");
        }


        private void button1_Click(object sender, EventArgs e)

        {

            userClick1._mdl();//此时,发现点击这个按钮一次就可以出发三连接的效果,

                              //使用不是很安全,因为可以被其他的点击事件直接调用

                                //下面用事件,就可以避免这种情况的发生1

        }

    }

}

 

 

userClick 代码:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;
 

namespace 三连击

{

    public delegate void MyDel();

    public partial class userClick : UserControl

    {

        public userClick()

        {

            InitializeComponent();

        }

        int i = 0;

        public MyDel _mdl;//定义一个委托字段

        private void button1_Click(object sender, EventArgs e)

        {

            i++;

            if (i==3)

            {

                i = 0;// 清零

                //MessageBox.Show("三连击");

                if (this._mdl!=null)

                {

                     _mdl();//委托不为空,就将委托字段_mdl,拿进来!!

                }

            }

        }

    }

}

 

总结:你辛苦的创建了一个委托进行事件的调用,可是,却被其他的,事件也可轻易地调用,不是想要的结果,。。可以这么说:你定义了一个报警器,当你吸烟的时候,就会警告。其他的事情发生就不会发出警告的。。可是,有一天,别人在你家外边敲了一下你的门子,你的警报器也响了。是不是感觉,这个警报器,失灵了呢。。。所以,就要对这个警报器,进行修改了!

 

14、下面用事件,就可以避免这种情况的发生1

 

事件!概念!!

 

新建项目  ---->>事件三连击

15、步骤和三连接是一样的,在委托字段前加上关键字event

唯一不同的是,在这里添加了 关键字 event ,就变成了事件

16、这里可以尝试着,写上DoSth()方法,发现是不行的。因为事件只能使用 ”+=“来赋值。。”-=“来移除事件,而没有 “  =  ”这样的使用方法,所以这样就避免了,被赋值的现象!!!

 

Form 1代码:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace 事件三连击

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

               //窗体加载的时候,给按钮注册事件!

            //userClick1._mdl = DoSth();   //假设有DoSth()这个方法

             userClick1._mdl += userClick1__mdl;        

        }

        void userClick1__mdl()

        {

            //throw new NotImplementedException();

            MessageBox.Show("+=后按下Tab键,就可以自动弹出方法了");

        }

        private void button1_Click(object sender, EventArgs e)

        {

            //userClick1._mdl(); //发现这里是不能调用的  ”=“不起作用

        }

        //public void DoSth()

        //{

        //    MessageBox.Show("这就是事件!!");

        // }

        //F6有错误!说明事件没有  =   号这个用法,只有  +=   —=这样的用法,所以就避免了,被赋值的事情的发生

    }

}

 

 

userClick  代码:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace 事件三连击

{

    public delegate void MyDel();

    public partial class UserClick : UserControl

    {

        public UserClick()

        {

            InitializeComponent();

        }

        int i = 0;

        public event MyDel _mdl;//唯一不同的是,在这里添加了 关键字 event ,就变成了事件

        private void button1_Click(object sender, EventArgs e)

        {

            i++;

            if (i==3)

            {

                i = 0;

                if (this._mdl!=null)//this。。点出来可以发现——mdl 是一个闪电的图标

                {

                      this._mdl();//调用方法

                }

                

            }

        }

    }

}

总结:

委托和事件的区别

1、委托和事件没有可比性,因为委托是数据类型,事件是对象(可以理解为对委托变量的封装。),下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的内部是用委托实现的。(举例子:三种实现事件方式的区别(直接用委托实现、用私有委托+公有方法模拟事件,直接用event事件实现))

2、因为对于事件来讲,外部只能“注册自己+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。addremove

3、事件是用来阉割委托实例的。事件只能addremove自己,不能赋值。事件只能+=-=,不能=、不能外部触发事件。 

总结:

1、委托的作用:

占位,在不知道将来要执行的方法的具体代码时,可以先用一个委托变量来代替方法调用(委托的返回值,参数列表要确定)。在实际调用之前,需要为委托赋值,否则为null

2、事件的作用:

事件的作用与委托变量一样,只是功能上比委托变量有更多的限制。(比如:1.只能通过+=-=来绑定方法(事件处理程序)2.只能在类内部调用(触发)事件。)

3、在自定义控件(自己编写控件的时候,会大量用到.编写控件的时候,会写一些事件。但是当这些事件 被触发以后,具体执行的那些事件处理程序是编写控件的人没法确定的。这个时候只能通过事件来占位(调用),具体调用的是哪个方法,由使用控件的人来决定(Click+=new 委托(方法名);))

 

转载于:https://www.cnblogs.com/xcl461330197/articles/4524577.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值