c#之委托和事件的区别

时间:2022-02-02 11:58:02

1、什么是委托,这里就不做介绍了,如果想了解可以查看博客:http://www.cnblogs.com/xiaoxiaogogo/p/3571494.html

下面开始对事件进行介绍

1、定义事件以及事件的编译原理

首先定义事件对应的委托:

 public delegate void ThreeClickEventDel();

然后对应事件变量:(其实就是在委托前面加一个event)

public event ThreeClickEventDel ThreeClickEvent;

反编译之后:是:一个“私有委托”和两个“公有”的“add”和“remover”方法

1)因为是私有委托:所以只有类的内部可以调用,在类外部就不能被调用。创建的类的实例也是不能调用的。所以事件是安全的。

因为私有,所以不能使用 “=”对事件进行赋值

2)因为有 “公有” 的add 和 remove,,所以 类的实例 可以对事件 进行 “+=”和“-=”对事件进行 添加 事件和 删除事件(所以在类的外部可以对事件进行赋值,但是不能调用)

2、委托和事件的区别:

1、委托时数据类型,但是 事件 是数据类型的变量(并且是私有委托)

2、委托可以在类的外部被调用,但是事件不能再类的外部,通过类的实例进行调用(因为是私有委托)

3、委托可以通过“=”、“+=”、“-=”进行赋值,但是事件只能通过“+=”和“-=”对事件进行赋值。(因为事件是私有委托)

3、委托也能注册事件,为什么会衍生出事件呢?

委托注册事件:

     //定义一个委托
public delegate void JingGaoDel();
class Program
{
static void Main(string[] args)
{
GuoluFang Guolu = new GuoluFang();
//为 委托注册 事件
Guolu.jingGao = delegate()
{
Console.WriteLine("水已经烧开了!");
};
for (int i = ; i <; i++)
{
Guolu.ShaoShui();
}
Console.ReadKey();
}
}

为什么衍生事件:

1、因为事件只能通过“+=”和“-=”进行赋值,所以可以避免像委托那样(可能用“=”赋值将原有的事件冲掉)。

2、事件虽然是public 定义的,但是会编译成“私有的委托”,所以事件只能在类的内部被调用,类的实例不能被调用。

4、使用事件的练习(窥探微软 的事件)

创建验证控件:

添加一个UserControl控件,设计如下:

c#之委托和事件的区别

写后台代码:

     public delegate void UserVilidateDel(object sender,MyEventArgs e);

     public partial class UserVilidateControl : UserControl
{
public UserVilidateControl()
{
InitializeComponent();
}
public event UserVilidateDel UserViliDating; private void btnLogin_Click(object sender, EventArgs e)
{
string userName = txtUserName.Text.Trim();
string pwd = txtPwd.Text.Trim();
MyEventArgs eArgs = new MyEventArgs();
eArgs.UserName = userName;
eArgs.Pwd = pwd;
eArgs.IsSuccess = false;
UserViliDating(this, eArgs);
if (eArgs.IsSuccess)
{
this.txtUserName.BackColor = Color.Blue;
this.txtPwd.BackColor = Color.Blue;
}
else
{
this.txtUserName.BackColor = Color.Red;
this.txtPwd.BackColor = Color.Red;
}
}
} public class MyEventArgs
{
public string UserName { set; get; }
public string Pwd { set; get; }
public bool IsSuccess { set; get; }
}

控件后台代码

主窗体添加验证控件:

c#之委托和事件的区别

后台代码:

         private void Form1_Load(object sender, EventArgs e)
{
//注册事件
userVilidateControl1.UserViliDating += new UserVilidateDel(userVilidateControl1_UserViliDating);
} //创建对应方法事件
void userVilidateControl1_UserViliDating(object sender, MyEventArgs e)
{
if (e.UserName == "admin" && e.Pwd == "")
{
e.IsSuccess = true;
}
}

c#之委托和事件的区别的更多相关文章

  1. C&num;中委托和事件的区别实例解析

    这篇文章主要介绍了C#中委托和事件的区别,并分别以实例形式展示了通过委托执行方法与通过事件执行方法,以及相关的执行流程与原理分析,需要的朋友可以参考下 本文实例分析了C#中委托和事件的区别,分享给大家 ...

  2. 委托、Lambda表达式、事件系列06&comma;使用Action实现观察者模式,体验委托和事件的区别

    在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式,并从中体验委托与事件 ...

  3. c&num; 委托与事件的区别

    委托与事件的区别 委托和事件没有可比性,因为委托是数据类型,事件是对象(可以理解为对委托变量的封装.),下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别.事件的内部 ...

  4. C&num;一些知识点:委托和事件的区别

    在C#中,委托和事件是比较容易混淆的两个知识点,本篇博客就记录一下委托和事件之间的区别. 定义上的区别 委托:委托实际上是一个类,用来表示一个函数,可以理解为C++中的函数指针. 事件:事件是一个修饰 ...

  5. C&num;中委托和事件的区别

    大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法.事件可以被看作一个委托类型的变量,通过事件注册.取消多个委托或方法.本篇分别通过委托和事件执行多个方法,从中体会两者的区别. □ 通过委托 ...

  6. C&num;多播委托和事件的区别与关系

    事件是对委托的封装. 如果一个类里,你把一个委托声明为 public 了,那么外部就可以随意改变委托变量的值,包括清空委托变量等,这样的话就违背了面向对象思想的封装特性:但如果声明为 private ...

  7. C&num;委托和事件的区别

    “委托是具有相同签名的函数(方法)的类型,事件是委托的应用方式之一” ---来自评论区老司机 delegate 是为了在C#中把函数作为对象传来传去而实现的一个“函数包装”.由于在C#中函数是二等公民 ...

  8. C&num; &period;Net 委托和事件的区别

    在.net中,事件是一种特殊的委托,那他到底特殊在哪,换句话说,加上event关键字到底有什么用,我理解主要有两方面,下面用实例说明: 一 .事件只能在本类型内部“触发”,委托不管在本类型内部还是外部 ...

  9. C&num;委托与事件--简单笔记

    委托 简单记录点东西 适合似懂非懂的朋友看看 委托类型用来定义和响应应用程序中的回调. 借此可以设计各种有面向对象特性的代码模式.下面要说的事件在我看来就是委托的一种实现,再深一步讲,利用委托加事件, ...

随机推荐

  1. mysql性能优化学习笔记-参数介绍及优化建议

    MySQL服务器参数介绍 mysql参数介绍(客户端中执行),尽量只修改session级别的参数. 全局参数(新连接的session才会生效,原有已经连接的session不生效) set global ...

  2. 【剑指offer】数字在排序数组中出现的次数

    2013-09-02 16:28:35 找出数字在排序数组中出现的次数. 注意几点: 一开始试图用size_t类型表示数组的下标begin.end,到那时这样做在end = 0时,end - 1是si ...

  3. Python问题记录:如何处理中文网页中的多余空格

    在制作Epub电子书的时候,因为有从网络上下载的格式比较混乱的电子书,现在打算自己用Pythonc处理一下. 1.如何删除掉网页(html)中的多余空额.尤其是包含在tag(标签:span.p)当中的 ...

  4. vmware压缩磁盘空间的方法

    家里笔记本40G,可用空间怎么挤都只剩7G,从单位copy回来的linux虚拟机要10G,经检查实际使用空间5.7,也就是其他都是空余空间,可以释放掉.(只适合independent.Persiste ...

  5. Linux远程自动输入密码抓取远程资源

    #!/usr/bin/expect -fset timeout 3000set sys_date [lindex $argv 0] #要抓取的文件日期spawn scp /data3/xiaorui/ ...

  6. linux下在root用户登陆状态下,以指定用户运行脚本程序实现方式

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABKCAIAAACASdeXAAAEoUlEQVR4nO2dy7WlIBBFTYIoSIIkmD ...

  7. AngularJS封装webupload实现文件夹上传

    百度的webupload没有开放api获取整个文件夹的信息.本文是二次开发webupload实现获取文件夹信息. 指令封装 /** * @license lx.ui.framework v1.0.0 ...

  8. 使用iconv进行编码gb2312转utf8 转码失败的坑

    iconv 编码gb2312转utf8 转码失败的坑 使用背景 项目中使用thrift进行C#程序调用c++接口,其中的协议是通过json进行传输的,由于默认thrift使用utf8进行传输,而C#和 ...

  9. ffmpeg 踩坑实录 近期使用总结(三)

    一.背景介绍 将ffmpeg运用到项目上已经有一段时间了,趁现在有空赶紧记下来. 二.技术点总结    2.1 实现方式 项目里面主要运用的形式是,在java端,调用操作系统的方法,并执行切片命令. ...

  10. java事务(三)

    java事务(三)——自己实现分布式事务 在上一篇<java事务(二)——本地事务>中已经提到了事务的类型,并对本地事务做了说明.而分布式事务是跨越多个数据源来对数据来进行访问和更新,在J ...