C#基础学习之委托的理解和应用
委托的使用和语法定义
委托的使用是由四步来完成的,依次为:声明委托、创建委托对象、委托关联方法、调用
我们用一个例子来说明这四步如何操作,我们完成一个老板委托员工写报告的实例,看如何实现。
首先我们应该定义两个类,老板类Boss和员工类Employee,老板委托员工写报告,其实是老板什么都没做,而是告诉员工去做事情(写报告),
那我们的定义如下
public class Boss
{
//声明委托
public delegate void DoWorkEventHandler(string content);
//创建委托对象
public DoWorkEventHandler WorkEventHandler;
//做事情
public void DoWork(string content)
{
if (WorkEventHandler != null)
{
WorkEventHandler.Invoke(content);
//或者如下调用
//handler(content);
}
}
}
委托的声明和创建都是在Boss里定义的,DoWork内部只是对委托进行了调用,但目前看不出来到底做了什么事情。
再看员工类的实现
public class Employee
{
public void DoWork(string content)
{
Console.WriteLine(string.Format("老板委托我{0}", content));
}
}
员工类里定义了DoWork方法,实现具体做什么事情
那接下来我们就来看Boss是如何委托给Employee做事情的
public class DelegateExecutor
{
public static void Run()
{
Boss boss = new Boss();
string content = "写报告";
//委托注册关联方法
boss.WorkEventHandler = new Boss.DoWorkEventHandler(new Employee().DoWork);
//
boss.DoWork(content);
}
}
其实在调用boss.DoWork的时候,内部是委托调用了Employee.DoWork方法。好了,这样我们最终完成老板委托员工写报告的功能。
委托的优点
如果我们按照一般的写法实现以上功能的话,我们可能这样写
public class Boss
{
public void DoWork(string content)
{
Employee employee = new Employee();
employee.DoWork(content);
}
}
我们看这样有个显著的问题就是Boss和Employee类产生了直接依赖,耦合在了一起,然而使用委托实现的例子中,Boss完全不知道Employee的存在,
消除了两者之间的耦合,是不是比传统的写法要好很多。
下篇文章我来介绍事件的使用
C#基础学习之委托的理解和应用的更多相关文章
- c#基础学习笔记-----------委托事件
这里有一个比较简单的委托实例应用(跨窗体操作控件) http://blog.csdn.net/bdstjk/article/details/7004035 还有一个比较详细的介绍并深入理解委托事件的讲 ...
- C#基础学习之事件的理解和应用
事件的使用和委托类似,也是分四步来实现:声明委托.定义事件.注册事件.调用事件 我们先看一下事件的定义 //定义委托 public delegate void PublishEventHandler( ...
- 爬虫技术 -- 基础学习(三)理解URL和URI的联系与区别
网络爬虫的基本操作是抓取网页.首先要了解下URL~~ 在理解URL之前,先了解下URI,这两个概念我曾经混淆过~@_@|| 什么是URI? Web上每种可用的资源,如:html文档.视频,图片等都由一 ...
- springmvc基础学习3---注解简单理解
1:@Controller 用来注解这个bean是MVC模型中的一个C 会被spring的auto-scan扫到纳入管理.Spring mvc框架中的action层注入,也就是控制层.控制器Contr ...
- MacOS下SpringBoot基础学习
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"springboot"获取视频和教程资料! b站在线视 ...
- Vue – 基础学习(1):对生命周期和钩子函的理解
一.简介 先贴一下官网对生命周期/钩子函数的说明(先贴为敬):所有的生命周期钩子自动绑定 this 上下文到实例中,因此你可以访问数据,对属性和方法进行运算.这意味着你不能使用箭头函数来定义一个生命周 ...
- 如何从零基础学习VR
转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 近期很多搞技术的朋友问我,如何步入VR的圈子?如何从零基础系统性的学习VR技术? 本人将于2017年1月 ...
- HTML5零基础学习Web前端需要知道哪些?
HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...
- CSS零基础学习笔记.
酸菜记 之 CSS的零基础. 这篇是我自己从零基础学习CSS的笔记加理解总结归纳的,如有不对的地方,请留言指教, 学前了解: CSS中字母是不分大小写的; CSS文件可以使用在各种程序文件中(如:PH ...
随机推荐
- DEV控件ASPxTextBox设置ClientEnabled="false"之后出现的问题
DEV控件ASPxTextBox设置ClientEnabled="false"之后,js中设置文本框的值后,按钮后台点击事件中获取文本框的值为空.
- springcloud-feign的hystrix支持
关于hystrix的介绍,可以看我的上篇博客:springcloud-断路器hystrixs 本文主要介绍在feign中,如何使用hystrix 1.pom依赖 <dependency> ...
- win10 uwp unix timestamp 时间戳 转 DateTime
有时候需要把网络的 unix timestamp 转为 C# 的 DateTime ,在 UWP 可以如何转换? 转换函数可以使用下面的代码 private static DateTime UnixT ...
- [日常] DNS的迭代查询过程
DNS是应用层协议,端口号为tcp/53和udp/53 DNS查询过程,比如访问www.test.com1.客户机查询www.test.com2.查询首选DNS服务器,Linux下/etc/resol ...
- 关于shader的学习
教程地址:https://onevcat.com/2013/07/shader-tutorial-1 因为想做一些特效,所以想稍微了解一下shader的代码,一下是一些笔记 // Upgrade NO ...
- python学习之老男孩python全栈第九期_day016知识点总结
'''数据类型:intbool... 数据结构:dict (python独有的)listtuple (pytho独有的)setstr''' # reverse() 反转l = [1,2,3,4,5]l ...
- 客户端ajax请求为实现Token验证添加headers后导致正常请求变为options跨域请求解决方法
客户端为了实现token认证,通过Jquery的ajaxSetup方法全局配置headers: 全局配置headers后会导致部分不需要token认证的请求变为options请求,导致跨域访问.报错信 ...
- opencv图像处理基础 (《OpenCV编程入门--毛星云》学习笔记一---五章)
#include <QCoreApplication> #include <opencv2/core/core.hpp> #include <opencv2/highgu ...
- mvc里全局错误日志
第一步在项目中找到App_Start文件夹下建立一个错误日志过滤器. 第二步在Global.asax文件中注册下日志过滤器 第三步: 继承一个ExceptionFilterAtrribute 第四步: ...
- iis配置asp.net常见问题解决方案
很多朋友在用IIS6架网站的时候遇到不少问题,而这些问题有些在过去的IIS5里面就遇到过,有些是新出来的,俺忙活了一下午,做 了很多次试验,结合以前的排错经验,做出了这个总结,希望能给大家帮上忙:) ...