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#委托与事件--简单笔记
委托 简单记录点东西 适合似懂非懂的朋友看看 委托类型用来定义和响应应用程序中的回调. 借此可以设计各种有面向对象特性的代码模式.下面要说的事件在我看来就是委托的一种实现,再深一步讲,利用委托加事件, ...
随机推荐
- C#程序开机运行
#region 系统启动项 /// <summary> /// 获取启动项值 /// </summary> /// <param name="name" ...
- CSS盒模型简单用法
1.盒模型 margin:外边距: margin-top /margin-right/margin-bottom/margin-left; 或者 margin:top right bottomleft ...
- JQuery Mobile + Cordova 实战一
好的,今天给大家继续讲解 JQM 和 Cordova 的结合吧.Cordova 和 Phonegap 反正是一个东西,大家就当做一个是旧版(Phonegap)的一个是新版(Cordova)的就行.不同 ...
- Part 59 to 60 Difference between Convert ToString and ToString,String and StringBuilder
Part 59 Difference between Convert ToString and ToString Part 60 Difference between String and Strin ...
- nodemanager启动失败
yarn启动报错: 2016-11-16 16:12:44,304 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Stopping N ...
- mysql数据库用户和权限管理记录
一.MySQL用户的基本说明: 1.1 用户的基本结构MySQL的用户:用户名@主机 ■用户名:16个字符以内■主机:可以是主机名.IP地址.网络地址等主机名:www.111cn.net,localh ...
- 复习IOS多线程知识
线程的注意点 1.不要同时开太多的线程(1~3条线程即可,不要超过5条) 2.线程概念 * 主线程 : UI线程,显示.刷新UI界面,处理UI控件的事件 * 子线程 : 后台线程,异步线程 3.不要把 ...
- 【学习笔记】【C语言】指针
一.指针变量的定义 1. 格式:变量类型 *指针变量名; 2. 举例:int *p; char *p2; 3. 注意:定义变量时的*仅仅是指针变量的象征 二.利用指针变量简单修改其他变量的值 1. ...
- 【学习笔记】【C语言】选择结构-if
1.if的第1种结构 if(条件) { 语句1; 语句2; ...... } 如果if右边小括号()中的条件成立,也就是为“真”时,就会执行大括号{}中的语句: 如果条件为假, ...
- [Bootstrap]组件(三)
输入框组 添加额外元素.input-group-addon 外包元素.input-group>input-group-addon+form-control <div class=" ...