请注意,这只是个人关于C#中委托的一点点理解,参考了一些博客,如有不周之处,请指出,谢谢!

  委托是一种函数指针,委托是方法的抽象,方法是委托的实例。委托是C#语言的一道坎,明白了委托才能算是C#真正入了门。委托在c#中的应用特别的多,最常见比如事件监听器就是利用委托来实现的。我们点击winform上面的一个按钮,系统就会响应,这其实就是委托。

  为什么要用委托呢?绝对不是为了简单问题复杂化。我们知道在程序设计当中,数据结构和算法是非常重要的,但是在实际的开发当中,我们好像又不太用的着这些东西,这是因为我们使用的都是高级语言,想java、c#这一类的。这些高级语言在设计的时候已经帮我们把这些问题考虑进去了,所以我们才感觉不到算法和数据结构的存在。举个最简单的例子,我们常用的List、HshTable之类的都是java帮我们定义好了的数据结构。委托也是这样。委托的存在本质上是为了让代码解耦,实现代码的可维护和可扩展。

  我们就以点击一个按钮,然后触发一个事件为例来说明。

public void btnConfirmOnClick()
{
FunctionA();
FunctionB();
}

在上面的这段代码中,当一个按钮被点击的时候,就会去主动地调用FunctionA();FunctionB();这两个方法,这就完成了我们的任务啊。但是,当用户的需求发生见二连三的改变的时候,上面的代码就会被频繁的改动,比如说,要新增加一个FunctionC(),这样一来,说明上面这段代码距离工程实践的要求还有一定的距离。按照23种设计原则的要求,当代码的耦合性太大的时候,就要对代码进行拆分,怎么拆分呢?就是引入一个新的类C,当按钮被点击的时候,btnConfirmOnClick()这个方法去通知类C,C再去调用FunctionA();FunctionB();这些方法,这其实就是委托的设计思想。

  下面是一段委托的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DelegateTest
{
class Program
{
static void Main(string[] args)
{
A a = new A(); // 定义按钮A B b = new B(a); // 定义响应事件B C c = new C(a); // 定义响应事件C // 按钮A被单击
a.Raise("单击"); // 按钮A被双击
//a.Raise("双击"); // 按钮A被三连击
//a.Fall(); Console.ReadLine();
// 由于B和C订阅了A的事件,所以无需任何代码,B和C均会按照约定进行动作。
}
} /// <summary>
/// 按钮A点击委托
/// </summary>
/// <param name="hand">点击:单击、双击</param>
public delegate void RaiseEventHandler(string hand);
/// <summary>
/// 按钮A被三连击委托
/// </summary>
public delegate void FallEventHandler();
/// <summary>
/// 按钮A
/// </summary>
public class A
{
/// <summary>
/// 按钮A点击事件
/// </summary>
public event RaiseEventHandler RaiseEvent;
/// <summary>
/// 按钮A被三连击事件
/// </summary>
public event FallEventHandler FallEvent; /// <summary>
/// 点击
/// </summary>
/// <param name="hand">手:单击、双击</param>
public void Raise(string hand)
{
Console.WriteLine("按钮A{0}点击", hand);
// 调用点击事件,传入单击或双击手作为参数
if (RaiseEvent != null)
{
RaiseEvent(hand);
}
}
/// <summary>
/// 被三连击
/// </summary>
public void Fall()
{
Console.WriteLine("按钮A被三连击");
// 调用被三连击事件
if (FallEvent != null)
{
FallEvent();
}
}
}
/// <summary>
/// 响应事件B
/// </summary>
public class B
{
A a; public B(A a)
{
this.a = a;
a.RaiseEvent += new RaiseEventHandler(a_RaiseEvent); // 订阅点击事件
a.RaiseEvent += new RaiseEventHandler(a_RaiseEvent); // 订阅点击事件
a.FallEvent += new FallEventHandler(a_FallEvent); // 订阅被三连击事件
}
/// <summary>
/// 按钮点击时的动作
/// </summary>
/// <param name="hand">若按钮A被单击,则B攻击</param>
void a_RaiseEvent(string hand)
{
if (hand.Equals("单击"))
{
Attack();
}
} /// <summary>
/// 按钮被三连击时的动作
/// </summary>
void a_FallEvent()
{
Attack();
} /// <summary>
/// 攻击
/// </summary>
public void Attack()
{
Console.WriteLine("响应事件B响应");
}
}
/// <summary>
/// 响应事件C
/// </summary>
public class C
{
A a;
public C(A a)
{
this.a = a;
a.RaiseEvent += new RaiseEventHandler(a_RaiseEvent); // 订阅点击事件
a.FallEvent += new FallEventHandler(a_FallEvent); // 订阅被三连击事件
}
/// <summary>
/// 按钮点击时的动作
/// </summary>
/// <param name="hand">若按钮A被双击,则攻击</param>
void a_RaiseEvent(string hand)
{
if (hand.Equals("双击"))
{
Attack();
}
} /// <summary>
/// 按钮被三连击时的动作
/// </summary>
void a_FallEvent()
{
Attack();
}
/// <summary>
/// 攻击
/// </summary>
public void Attack()
{
Console.WriteLine("响应事件C响应");
}
} }

C#中委托的理解的更多相关文章

  1. C#中委托、事件和回调函数的理解

    在C#中我们经常会碰到事件,尤其是在WPF或者WinForm中,窗体加载.或者点击一个按钮,都会触发事件.实际上,事件是对委托的封装.如果不进行封装,让委托暴露给调用者,调用者就可以把委托变量重新引用 ...

  2. C#中委托、匿名函数、Lambda表达式的一些个人理解

    0x01定义一个委托,相当于定义一个可以存储方法的特殊变量类型 下面我们看具体的代码,通过代码更好理解 delegate void IntMethodInvoker(int x); 这行代码就是声明一 ...

  3. 关于c#中委托使用小结

    一.简述: 委托对与我们编程人员来说,一点都不陌生,在实际工作过程中,或多或少都应该是接触过 但是对与编程新手来说,对与委托的理解和使用应该还是一个坎,但是只要理解清楚了,这个坎也就过去了. 最近也经 ...

  4. C#中委托和事件

    目 录 将方法作为方法的参数 将方法绑定到委托 更好的封装性 限制类型能力 范例说明 Observer 设计模式简介 实现范例的Observer 设计模式 .NET 框架中的委托与事件 为什么委托定义 ...

  5. C# 委托的理解

    1.什么是委托 委托可以理解为持有一个或多个方法的对象.如果执行委托的话,委托会 执行它所"持有"的方法.委托可以避免程序中大量使用if-else语句,使 程序拥有更好的扩展性. ...

  6. c#中委托和事件(转)

    C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 ...

  7. C#中委托

    委托是一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似.与 C 中的函数指针不同,委托是面向对象的.类型安全的和保险的.一个委托类型是代表与特定参数列表和返回类型的方法的引用类型.实例 ...

  8. C#中委托如何使用?(转帖)

    1.委托概述委托是C#中新加入的一个类型,可以把它想作一个和Class类似的一种类型,和使用类相似,使用一个委托时,需要两个步骤,首先你要定义一个委托,就像是定义一个类一样:然后,你可以创建一个或多个 ...

  9. C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路

    C#不用union,而是有更好的方式实现   用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...

随机推荐

  1. error:0906D064:PEM routines:PEM_read_bio:bad base64 decode

    今天在使用easywechat对接企业打款到银行卡时,遇到了两个错误 error:0906D064:PEM routines:PEM_read_bio:bad base64 decode 和 erro ...

  2. Hadoop分布式集群搭建_1

    Hadoop是一个开源的分布式系统框架 一.集群准备 1. 三台虚拟机,操作系统Centos7,三台主机名分别为k1,k2,k3,NAT模式 2.节点分布 k1: NameNode DataNode ...

  3. 单片机中不带字库LCD液晶屏显示少量汉字

    单片机中不带字库LCD液晶屏如何显示少量汉字,一般显示汉字的方法有1.使用带字库的LCD屏,2.通过SD 卡或者外挂spi flash存中文字库,3.直接将需要的汉字取模存入mcu的flash中. 第 ...

  4. UART学习之路(一)基本概念

    第一篇博客,首先记录一下这一个多星期来的学习内容. UART学习之路第一篇,是UART的基本概念介绍.后续会用STM32F103的串口与PC机通信.最后使用Verilog HDL写出串口发送模块和接收 ...

  5. Activemq首次运行报错 “找不到或无法加载主类”

    首次运行Program Files\apache-activemq-5.10.0\bin目录下的activemq.bat文件,报错信息如下: 找不到或无法加载主类 Files\apache-activ ...

  6. 20155332 实验二 Java面向对象程序设计

    目录 一.单元测试和TDD 任务一:实现百分制成绩转成"优.良.中.及格.不及格"五级制成绩的功能 任务二:以TDD的方式研究学习StringBuffer 二.面向对象三要素:封装 ...

  7. 【LOJ10121】与众不同

    [LOJ10121]与众不同 题面 LOJ 题解 这题是_\(tham\)给\(ztl\)他们做的,然而这道题™居然还想了蛮久... 首先可以尺取出一个位置\(i\)上一个合法的最远位置\(pre_i ...

  8. TCP三次握手和四次挥手以及11种状态

    1.三次握手 置位概念:根据TCP的包头字段,存在3个重要的标识ACK.SYN.FIN ACK:表示验证字段 SYN:位数置1,表示建立TCP连接 FIN:位数置1,表示断开TCP连接 三次握手过程说 ...

  9. [FJOI2014]最短路径树问题 长链剖分

    [FJOI2014]最短路径树问题 LG传送门 B站传送门 长链剖分练手好题. 如果你还不会长链剖分的基本操作,可以看看我的总结. 这题本来出的很没水平,就是dijkstra(反正我是不用SPFA)的 ...

  10. [SDOI2010]地精部落 DP

    LG传送门 DP好题 题意很简单,就是求1-n的排列,满足一个数两边的数要么都比它大要么都比它小,求这样的排列个数对\(p\)取膜的值(为了表述简单,我们称这样的排列为波动序列). 这个题我第一眼看到 ...