一、Delegate委托可以理解为一个方法签名。

    可以将方法作为另外一个方法的参数带入其中进行运算。在C#中我们有三种方式去创建委托,分别如下:

        public delegate void Print(string str);

        static void delegatemethod(string str)
{
Console.WriteLine(str);
} public static void Main()
{
#region 委托
//1.普通委托
var print1 = new Print(delegatemethod);
print1("这是普通方式创建的委托");
//2.匿名委托
Print print2 = delegate(string str) {
Console.WriteLine(str);
};
print2("这是匿名方式创建的委托");
//3.lambda委托
Print print3 = (string str) => {
Console.WriteLine(str);
};
}

  二、Event事件,是一种封装过的委托。

    它拥有以下三要素:

    1.事件发行者-达到某些条件时激发事件的对象

    2.事件订阅者-订阅事件并对事件发生时进行处理的对象

    3.定义发行者和订阅者关系,一个发行者可能会有多个订阅者。

  三、事件和委托的区别

    1.委托允许直接通过委托去访问相应的处理函数,而事件只能通过公布的回调函数去调用

    2.事件只能通过“+=”,“-=”方式注册和取消订户处理函数,而委托除此之外还可以使用“=”直接赋值处理函数。

  最后我们可以看看整个自定义事件的处理办法以及事件和委托的区别如下代码:

    //事件参数
public class My_EventArgs : EventArgs
{
private string _args = string.Empty;
public My_EventArgs(string args)
{
_args = args;
}
public string Args
{
get { return _args; }
}
} //事件发行者
public class SourceClass
{
public double Width { get; set; }
public double Height { get; set; } My_EventArgs Evargs;
public SourceClass(string args)
{
Evargs = new My_EventArgs(args);
}
//定义委托
public delegate void EventHandler(object sender, My_EventArgs args); #region 使用委托方式声明
public EventHandler Clicked;
public void ClickedAsync()
{
if (Clicked != null)
{
Clicked(this, Evargs);
}
}
#endregion
#region 使用事件方式声明
public event EventHandler Click;
public void ClickAsync()
{
if (Click != null)
{
Click(this, Evargs);
}
}
#endregion
}
//事件订阅者
public class Del
{
public delegate void Print(string str); static void delegatemethod(string str)
{
Console.WriteLine(str);
} public static void Main()
{
#region 委托
//1.普通委托
var print1 = new Print(delegatemethod);
print1("这是普通方式创建的委托");
//2.匿名方法
Print print2 = delegate(string str) {
Console.WriteLine(str);
};
print2("这是匿名方法创建的委托");
//3.lambda委托
Print print3 = (string str) => {
Console.WriteLine(str);
};
print3("这是lambda方式创建的委托");
#endregion #region 事件
SourceClass source = new SourceClass("我的事件被触发");
source.Width = 5.0;
source.Height = 3.0;
//一、委托方式允许source.Clicked(source, new My_EventArgs("我使用委托方式调用的Args"));调用
source.Clicked = new SourceClass.EventHandler(source_RightClick);
source.Clicked += new SourceClass.EventHandler(source_LeftClick);
source.ClickedAsync();
source.Clicked(source, new My_EventArgs("我使用委托方式调用的Args"));
//二、很明显用户希望通过使用source.ClickedAsync();去调用函数,而非直接使用上行代码去调用,所以在这里需要使用Event关键字进行申明
//注1.事件方式不允许source.Clicked(source, new My_EventArgs("我使用委托方式调用的Args"));直接调用
//注2.事件不允许 source.Click = new SourceClass.EventHandler(source_LeftClick);直接赋值
source.Click += new SourceClass.EventHandler(source_LeftClick);
source.ClickAsync();
//注销事件和注册事件
source.Click -= new SourceClass.EventHandler(source_LeftClick);
source.Click += new SourceClass.EventHandler(source_RightClick);
source.ClickAsync();
Console.ReadLine();
#endregion
}
//事件处理方法1
static void source_LeftClick(object sender, My_EventArgs args)
{
SourceClass source = sender as SourceClass;
Console.WriteLine("目标宽度:" + source.Width + ",目标高度:" + source.Height);
Console.WriteLine("目标对象参数:"+args.Args); } //事件处理方法2
static void source_RightClick(object sender, My_EventArgs args)
{
SourceClass source = sender as SourceClass;
Console.WriteLine("目标面积:" + source.Width *source.Height);
}
}

  运行的效果图如下:

转 https://www.cnblogs.com/chengxingliang/archive/2013/05/21/3051912.html

C#知识点总结系列:3、C#中Delegate和Event的更多相关文章

  1. C#知识点总结系列:3、C#中Delegate和Event以及它们的区别

    1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 ...

  2. C#中Delegate和Event以及它们的区别(转载)

    一.Delegate委托可以理解为一个方法签名. 可以将方法作为另外一个方法的参数带入其中进行运算.在C#中我们有三种方式去创建委托,分别如下: public delegate void Print( ...

  3. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程

    反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)   背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...

  4. iOS流布局UICollectionView系列七——三维中的球型布局

      摘要: 类似标签云的球状布局,也类似与魔方的3D布局 iOS流布局UICollectionView系列七——三维中的球型布局 一.引言 通过6篇的博客,从平面上最简单的规则摆放的布局,到不规则的瀑 ...

  5. 浅谈c#中的delegate和event了

    一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那就趁着阳光明媚的早晨简单来谈谈delegate和ev ...

  6. 转iOS中delegate、protocol的关系

    iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolc ...

  7. .NET 中易混淆的概念(Delegate vs Event)

    事件(event)是一个非常重要的概念,我们的程序时刻都在触发和接收着各种事件:鼠标点击事件,键盘事件,以及处理操作系统的各种事件.所谓事件就是 由某个对象发出的消息.比如用户按下了某个按钮,某个文件 ...

  8. 浏览器扩展系列————在WPF中定制WebBrowser快捷菜单

    原文:浏览器扩展系列----在WPF中定制WebBrowser快捷菜单 关于如何定制菜单可以参考codeproject上的这篇文章:http://www.codeproject.com/KB/book ...

  9. jQuery中delegate与on的用法与区别

    在jQuery1.7中 .delegate()已被.on()取代.对于早期版本,它仍然使用事件委托的最有效手段. 在事件绑定和委派,delegate()和on在一般情况下,这两种方法是等效的. .de ...

随机推荐

  1. vmem驱动设备

    vmem是内存多字符设备.包含vfs的open.read.write.ioctl.poll.fasync和release函数,device文件的读写. virtual_mem.c #include & ...

  2. 高性能服务器架构 的几个注意点 (High-Performance Server Architecture)

    High-Performance Server Architecture 高性能服务器架构 来源:http://pl.atyp.us/content/tech/servers.html译文来源:htt ...

  3. git之cherry-pick

    当想把当前分支提交的代码,也在其他分支提交,那可以用cherry-pick命令. 1 假设在master分支commit的id为:abc12345; 2 切换到其他分支,如develop分支; 3 在 ...

  4. bzoj 3992 [SDOI2015]序列统计——NTT(循环卷积&&快速幂)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3992 有转移次数.模M余数.方案数三个值,一看就是系数的地方放一个值.指数的地方放一个值.做 ...

  5. MyEclipse启动tomcat增加内存配置

    omcat增加内存在catalina.bat下 MyEclipse增加内存 设置Window->Preferences->Application Servers->Tomcat -- ...

  6. [MySQL-MM] 生产环境自动恢复MM中一台M2库的过程,分享从零开始写的自动化重建脚本以及思路 (转)

    必须是MM架构,而且一台主库M1是完好无损的,一台主库M2可以根据M1主库来进行重建:如果MS架构,自己可以稍微做一下脚本修改动作,也能使用,架构如下图所示: 3  总体思路,建立主脚本a_build ...

  7. 【转】Inter-eNB S1 切换

    本博客介绍Inter-eNB的S1切换的流程 当eNB收到测量报告,或是因为内部负荷分担等原因,触发了切换判决,进行eNB间小区间通过S1口的切换. 源eNB通过S1接口的 HANDOVER REQU ...

  8. Python操作Excel,并结合unittest单元测试框架

    第一步:写Excel操作方法 excel_operate.py文件 from openpyxl import load_workbook #引入模块 class MyExcel: def __init ...

  9. kafka集群安装和kafka-manager

    1.软件环境 (3台服务器-测试)10.11.12.31 mykafka110.11.12.32 mykafka210.11.12.33 mykafka3 [root@localhost ~]# ca ...

  10. 如何平衡MMO游戏

    转自:http://blog.sina.com.cn/s/blog_9f56a65f01013eti.html 前言 这是一篇出自国外博客“Elder Game”的一篇文章,笔者觉得里面很多东西说的很 ...