请注意,这只是个人关于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. Linux 字符设备驱动—— ioremap() 函数解析

    一. ioremap() 函数基础概念 几乎每一种外设都是通过读写设备上的相关寄存器来进行的,通常包括控制寄存器.状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址.根据CPU体系结构的不同, ...

  3. 01-Python简介

    人生苦短,我用 Python —— Life is short, you need Python 目标 Python 的起源 Python 解释器 是用 C 语言实现的,并能够调用 C 语言的库文件. ...

  4. JVM类加载机制概述

    首先类加载在整个体系结构的哪一个环节呢?见红色圈住的部分. 类加载器分为那几个过程呢?五个过程 加载 根据类的全限定名(简单理解为类的绝对路径,见附录),找到指定的字节码文件,并在内存中生产一个jav ...

  5. vue搭建项目

    vue-cli 作用:快速搭建项目脚手架 安装3.0:npm i -g @vue/cli 安装桥接工具:npm i -g @vue/cli-init (vue-cli 3和旧版使用相同的命令,所以2被 ...

  6. Potree学习总结

    一.      简介 基于Web端的三维模型展示,这里仅介绍Three.js和Potree. Three.js 是一款基于WebGL的运行在浏览器中的 3D 开源引擎,用它创建各种三维场景.它类似于M ...

  7. Zabbix学习之路(二)之添加主机监控及自定义item监控

    1.zabbix_get命令详解 安装zabbix-get命令 [root@linux-node1 ~]# yum install -y zabbix_get 参数说明: -s --host: 指定客 ...

  8. MySQL入门篇(二)之常见命令管理

    一.SQL结构化查询语言 SQL,英文全称Structured Query Language,中文意思是结构化查询语言.它是一种对关系数据库中的数据进行定义和操作的语言方法,是大多数关系数据库管理系统 ...

  9. MSP-EZ430U_02板子测试使用

    1. 实物如下 2. 先上电,显示驱动没安装 3. 找到驱动的位置,不过实际上安装IAR for msp430之后,驱动就自动的识别了.

  10. MindMaster安装教程以及激活破解教程

    原文地址:https://www.jianshu.com/p/16d2fc7d8e45 第一.激活必须首先断网 第二.运行安装程序,安装完成后先不要打开 第三.把Cracks文件夹下的文件复制到软件安 ...