c#之委托和事件的区别
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控件,设计如下:

写后台代码:
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; }
}
控件后台代码
主窗体添加验证控件:

后台代码:
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#之委托和事件的区别的更多相关文章
- C#中委托和事件的区别实例解析
这篇文章主要介绍了C#中委托和事件的区别,并分别以实例形式展示了通过委托执行方法与通过事件执行方法,以及相关的执行流程与原理分析,需要的朋友可以参考下 本文实例分析了C#中委托和事件的区别,分享给大家 ...
- 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别
在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式,并从中体验委托与事件 ...
- c# 委托与事件的区别
委托与事件的区别 委托和事件没有可比性,因为委托是数据类型,事件是对象(可以理解为对委托变量的封装.),下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别.事件的内部 ...
- C#一些知识点:委托和事件的区别
在C#中,委托和事件是比较容易混淆的两个知识点,本篇博客就记录一下委托和事件之间的区别. 定义上的区别 委托:委托实际上是一个类,用来表示一个函数,可以理解为C++中的函数指针. 事件:事件是一个修饰 ...
- C#中委托和事件的区别
大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法.事件可以被看作一个委托类型的变量,通过事件注册.取消多个委托或方法.本篇分别通过委托和事件执行多个方法,从中体会两者的区别. □ 通过委托 ...
- C#多播委托和事件的区别与关系
事件是对委托的封装. 如果一个类里,你把一个委托声明为 public 了,那么外部就可以随意改变委托变量的值,包括清空委托变量等,这样的话就违背了面向对象思想的封装特性:但如果声明为 private ...
- C#委托和事件的区别
“委托是具有相同签名的函数(方法)的类型,事件是委托的应用方式之一” ---来自评论区老司机 delegate 是为了在C#中把函数作为对象传来传去而实现的一个“函数包装”.由于在C#中函数是二等公民 ...
- C# .Net 委托和事件的区别
在.net中,事件是一种特殊的委托,那他到底特殊在哪,换句话说,加上event关键字到底有什么用,我理解主要有两方面,下面用实例说明: 一 .事件只能在本类型内部“触发”,委托不管在本类型内部还是外部 ...
- C#委托与事件--简单笔记
委托 简单记录点东西 适合似懂非懂的朋友看看 委托类型用来定义和响应应用程序中的回调. 借此可以设计各种有面向对象特性的代码模式.下面要说的事件在我看来就是委托的一种实现,再深一步讲,利用委托加事件, ...
随机推荐
- codevs3732==洛谷 解方程P2312 解方程
P2312 解方程 195通过 1.6K提交 题目提供者该用户不存在 标签数论(数学相关)高精2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 已知多项式方程: a ...
- JQ笔记
参数形式$("input:text",document.forms[0])选择form[0]所有input=text$("<p>123</p>&q ...
- css奇特用法之 IMG添加背景图片配合显示--效果惊艳
IMG标签本身是显示图片的,但通过CSS可以再为其设置背景图片,让其和自身的图片配合来显示,最终的效果会让你惊叹.当然,这个发现来自于老外,所以代码马上与大家分享.再此之前,我也从来没有想到过这个思路 ...
- Part 1 What is SSMS?
note that,SSMS is a client tool and not the server by itself,it is a developer machines connects to ...
- DWZ(JUI) 教程 中如何整合第三方jQuery插件
Query插件一般是$(document).ready()中初始化 $(document).ready(function(){ // 文档就绪,初始化jQuery插件| }); // 或者或缩写形 ...
- JS中NULL和undifined区别及NULL的作用
1.博客地址:http://www.cnblogs.com/eastday/archive/2010/03/03/1677324.html 2.参考地址2:https://www.zhihu.com/ ...
- CentOS系统下安装以及卸载mysql
CentOS7的yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1. 下载mysql的repo源 [root@localhost `]$ wget htt ...
- iframe滚动条的一些方法
用iframe布局,会碰到浏览器右边出现2个滚动条,简单代码解决用iframe布局,会碰到浏览器右边出现2个滚动条, 简单代码解决,用下面的代码可以把浏览器本身的滚动条去掉,只留页面产生的滚动条: b ...
- c#的DateTime.Now函数详解
//2008年4月24日System.DateTime.Now.ToString("D");//2008-4-24System.DateTime.Now.ToString(&quo ...
- 20160126深入浅出obc知识点整理
1.错误域Error Domain NSMachErrorDomain:系统内核错误 NSPOSIXErrorDomain:系统错误 NSOSStatusErrorDomian:MacOS9之前的错误 ...