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#之委托和事件的区别的更多相关文章

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

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

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

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

  3. c# 委托与事件的区别

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

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

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

  5. C#中委托和事件的区别

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

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

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

  7. C#委托和事件的区别

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

  8. C# .Net 委托和事件的区别

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

  9. C#委托与事件--简单笔记

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

随机推荐

  1. C#程序开机运行

    #region 系统启动项 /// <summary> /// 获取启动项值 /// </summary> /// <param name="name" ...

  2. CSS盒模型简单用法

    1.盒模型 margin:外边距: margin-top /margin-right/margin-bottom/margin-left; 或者 margin:top right bottomleft ...

  3. JQuery Mobile + Cordova 实战一

    好的,今天给大家继续讲解 JQM 和 Cordova 的结合吧.Cordova 和 Phonegap 反正是一个东西,大家就当做一个是旧版(Phonegap)的一个是新版(Cordova)的就行.不同 ...

  4. 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 ...

  5. nodemanager启动失败

    yarn启动报错: 2016-11-16 16:12:44,304 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Stopping N ...

  6. mysql数据库用户和权限管理记录

    一.MySQL用户的基本说明: 1.1 用户的基本结构MySQL的用户:用户名@主机 ■用户名:16个字符以内■主机:可以是主机名.IP地址.网络地址等主机名:www.111cn.net,localh ...

  7. 复习IOS多线程知识

    线程的注意点 1.不要同时开太多的线程(1~3条线程即可,不要超过5条) 2.线程概念 * 主线程 : UI线程,显示.刷新UI界面,处理UI控件的事件 * 子线程 : 后台线程,异步线程 3.不要把 ...

  8. 【学习笔记】【C语言】指针

    一.指针变量的定义 1. 格式:变量类型 *指针变量名; 2. 举例:int *p;   char *p2; 3. 注意:定义变量时的*仅仅是指针变量的象征 二.利用指针变量简单修改其他变量的值 1. ...

  9. 【学习笔记】【C语言】选择结构-if

    1.if的第1种结构 if(条件) {     语句1;     语句2;     ...... } 如果if右边小括号()中的条件成立,也就是为“真”时,就会执行大括号{}中的语句: 如果条件为假, ...

  10. [Bootstrap]组件(三)

    输入框组 添加额外元素.input-group-addon 外包元素.input-group>input-group-addon+form-control <div class=" ...