当前位置: 首页 > news >正文

C#委托

转自:http://www.cnblogs.com/ArmyShen/archive/2012/08/31/2664727.html

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用if-else(switch)语句,同时使得程序具有更好的可扩展性。

使用委托可以将多个方法绑定到同一个委托变量上(通常称这个委托变量为:委托链),当调用此变量时,会依次调用所有绑定的方法;于此同时,也可以通过类似绑定的方式删除方法。

 

一个简单的委托例子

复制代码
using System;
using System.Collections;

namespace Delegate { //用delegate关键字声明一个委托 //委托原型必须与预委托的方法具有相同的返回值和参数类型 delegate void LearnDelegate(string name); public class Test {
     //要进行委托的方法 static void LearnA(string name) { Console.WriteLine("小王在学" + name); }        static void LearnB(string name) { Console.WriteLine("小张在学" + name); } static void Main() { //创建委托实例,并把委托函数名当作参数传递给委托对象 LearnDelegate learn_A = new LearnDelegate(LearnA); LearnDelegate learn_B = new LearnDelegate(LearnB); //通过委托对象,给绑定的函数传递参数,其实现在的learn_A和learn_B就是learnA和learnB的函数别名 learn_A("C#"); learn_B("C++"); } } }
复制代码

 

委托链

复制代码
static void Main()
{
  //创建委托实例
  LearnDelegate learn_A = new LearnDelegate(LearnA);   LearnDelegate learn_B = new LearnDelegate(LearnB);   //声明一个委托链,不需要实例化它   LearnDelegate DelegateLst;   //把委托对象直接相加并赋给委托链   DelegateLst = learn_A + learn_B;   //给委托链传值   DelegateLst("编程");   Console.WriteLine();   //同样,也可以对委托链中的委托对象进行添加和删除操作    DelegateLst -= learnA;//删除一个委托方法,这里使用DelegateLst -= Learn_A;效果是一样的,因为此时可以看作它是LearnA方法的一个别名   DelegateLst("编程");   Console.WriteLine();   DelegateLst += learnB;//添加一个委托方法,同样这里也可以使用DelegateLst += Learn_B;   DelegateLst("编程"); }
复制代码

 

委托链的简化使用

复制代码
using System;
using System.Collections;

namespace Delegate { //用delegate关键字声明一个委托 //委托原型必须与预委托的方法具有相同的返回值和参数类型 delegate void LearnDelegate(string name); public class Test { static void Main() { //声明一个委托链,赋null值 LearnDelegate DelegateLst = null; //下面这种形式其实是匿名方法的一种应用 DelegateLst += delegate(string name) { Console.WriteLine("小王在学" + name); }; DelegateLst += delegate(string name) { Console.WriteLine("小张在学" + name); }; DelegateLst("编程"); } } }
复制代码

 

最后的一个例子

复制代码
using System;
using System.Collections;

namespace Delegate { //用delegate关键字声明一个委托 //委托原型必须与预委托的方法具有相同的返回值和参数类型 delegate void AnimalDelegate(string AnimalName); class Animal { public Animal() { } //要进行委托的方法 public void Miaow(string name) { Console.WriteLine( name + " 喵喵叫"); } //要进行委托的方法 public void Bark(string name) { Console.WriteLine(name + " 汪汪叫"); } //要进行委托的方法 public void Baa(string name) { Console.WriteLine(name + " 咩..."); } } public class MainFunc { static void choseAnimal(string name, AnimalDelegate delegateFun) { delegateFun(name); } static void Main() { /*AnimalDelegate cat = new AnimalDelegate(new Animal().Miaow); cat("猫咪"); AnimalDelegate dog = new AnimalDelegate(new Animal().Bark); dog("狗狗");*/ //上下的两种调用方式是等价的  choseAnimal("喵星人", new Animal().Miaow); choseAnimal("汪星人", new Animal().Bark); choseAnimal("喜洋洋", new Animal().Baa); } } }
复制代码

转载于:https://www.cnblogs.com/cugwx/p/4060105.html

相关文章:

  • 力扣(LeetCode)965
  • 快速上手git
  • Android开发最佳学习路线图
  • 相对友好的 AVL Tree 教程
  • oracle中sql优化读书笔记1-优化器
  • SpringBoot之devtools热部署
  • Web自动化测试框架Watir(基于Ruby) - 第2章 使用Watir写自动化测试脚本
  • JSP 动作元素
  • Git很好的教程
  • 效果逆天的通用语言模型GPT 2.0来了,它告诉了我们什么?
  • [转]页面换肤功能浅析
  • 域名在QQ微信被拦截怎么办 怎么样才能让被微信屏蔽的网址正常访问使用
  • Cocos2dX Android 编译出错
  • 关于Mobius反演
  • 常用的正则表达式
  • 【EOS】Cleos基础
  • 78. Subsets
  • Android系统模拟器绘制实现概述
  • create-react-app做的留言板
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JavaWeb(学习笔记二)
  • Redux 中间件分析
  • REST架构的思考
  • springMvc学习笔记(2)
  • TCP拥塞控制
  • win10下安装mysql5.7
  • ​linux启动进程的方式
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • !!java web学习笔记(一到五)
  • #pragma multi_compile #pragma shader_feature
  • #WEB前端(HTML属性)
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • ( 10 )MySQL中的外键
  • (1)Nginx简介和安装教程
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (20050108)又读《平凡的世界》
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (pojstep1.1.2)2654(直叙式模拟)
  • (zhuan) 一些RL的文献(及笔记)
  • (多级缓存)多级缓存
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (十六)串口UART
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转) Android中ViewStub组件使用
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET Core 2.1路线图
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET 材料检测系统崩溃分析
  • @RequestMapping 的作用是什么?
  • [ JavaScript ] JSON方法
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解