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的存在,

消除了两者之间的耦合,是不是比传统的写法要好很多。

下篇文章我来介绍事件的使用

时间: 2024-10-08 02:50:20

C#基础学习之委托的理解和应用的相关文章

C#基础学习之事件的理解和应用

事件的使用和委托类似,也是分四步来实现:声明委托.定义事件.注册事件.调用事件 我们先看一下事件的定义 //定义委托 public delegate void PublishEventHandler(string msg); //定义事件 public event PublishEventHandler OnPublish; 事件注册和取消注册是用+=和-=方法名来完成的,如 publisher.OnPublish += method; 最后就可以调用事件了 OnPublish(msg); 我们

c#委托的理解和基础学习

 C#委托的理解和基础学习 Delegate,委托,是c#中非常重要的一个概念,使用委托使程序员可以将方法引用封装在委托对象内.然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法.与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的.用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西.在使用委托的时候,你可以像对待一个类一样对待它.即先声明,再实例化.只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托. 比如:

深入学习C#委托

一基础学习: .Net delegate类型:委托跟回调函数是很有渊源的.回调其实跟通知机制有关,考虑这样一个基本的事件序列: a对象调用了b对象的某个方法,希望b对象在其方法完成之时调用a对象的某个方法.要实现这样的过程,要求b对象持有a对象的引用(引用一般作为b 对象方法的参数传入),且“知道”a对象的那个特定方法.这个方法就是我们说的那个回调函数.本质上,.net的委托类型是一种类型安全的指向方法的对象(c++中如函数指针)亦或是指向一系列方法的对象.所谓类型安全指:类型必须匹配,变量或引

Yaf零基础学习总结3-Hello Yaf

Yaf零基础学习总结3-Hello Yaf 上一次我们已经学习了如何安装yaf了,准备工作做好了之后我们来开始实际的编码了,码农都知道一个经典的语句就是“Hello World”了,今天我们开始入手Yaf,目标只要能得到“Hello Yaf”就可以了,不多说,下面开始了.(注:需要读者有一定的MVC知识基础,最好用过一些其他简单的框架) 1.组织目录结构 对于使用过框架的来说这点很好理解,对于没使用过框架的来说建议先别在这死磕,先记着吧,简单点就是对于我们的文件结构做一些规定,让自己和别人都能看

Linux shell脚本基础学习详细介绍(完整版)二

详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续. Linux shell脚本基础已经被分成好几个部分了,这里对控制流程的内容也就马上讲完了,这是最后一部分关于here document,这里举例稍微有点复杂,我们慢慢来分析这个复杂Linux shell脚本. 6. Here documents 当要将几行文字传递给一个命令时,here docu

ASP.NET知识重新梳理(二)------关于ASP.NET知识学习流程的一些理解

ASP.NET知识的学习流程我大概是这么理解的,首先我们必须打好C#的基础,若是之前没有学过C++之类的面向对象语言作为基础,还是要好好看看继承派生多态之类的区别和联系的:其次,当今的编程不仅仅只是我们在学校课堂上所学的控制台应用程序,我们还要学习winfom,WPF之类的本地窗体应用:第三,每个公司的技术方向都是不同的,但是共同的地方是都需要数据库来存储自己的数据,而且sqlserver,mysql,oracle都是大同小异的,所以如果你之前的编程学的不是很好,做一个DBA吧,入门难度也不是很

opengl基础学习专题 (一 )编程环境搭建

题外话: 第一次在博客园上同大家分享博文.水的的地方,错别字的地方.环境交流.批评.知道了马上改. 以前在百度空间中写技术分享博文,后来百度啥也没说就把整个空间封了.当时感觉 还是有点寒心.只想黑一下它,厂长老了.场子也该换了. 对于想写个oepngl基础学习的专题,主要是网上资源有点老,好多都运行不了,买了红宝书<<OpenGL 编程指南 第8版>>,看了还看,觉得有点专业,优化和技术核心讲的的多. 而且都是代码片段,像自己这种门外汉学习起来还是觉得基础不行.需要恶补一下关于 f

黑马程序员_毕向东_Java基础视频教程_Java基础学习知识点总结

黑马程序员_毕向东_Java基础视频教程 Java基础学习知识点总结 2016年01月06日  day01 一.基础知识:软件开发 1.什么是软件?软件:一系列按照特定顺序组织的计算机数据和指令的集合. 2.常见的软件:系统软件:如:DOS,Windows,Linux等.应用软件:如:扫雷,迅雷,QQ等. 3.什么是开发?制作软件. 二.基础知识:人机交互方式 4.软件的出现实现了人与计算机之间的更好的交互. 5.交互方式:图形化界面:这种方式简单直观,使用者易于接受,容易上手操作.命令行方式:

Java基础学习1-Java标识符及基本类型

暑假闲来无事,重新学习Java,希望能够加深自己对Java的理解与深入. 第一天,从Java标识符开始. Java标识符的命名规则 - 标识符必须以字母.下划线.美元符$开头. - 标识符其它部分可以是字母.下划线.美元符$和数字的任意组合. - Java标识符的大小写敏感,无长度限制(但是也不要太长,会变成裹脚布的(/ □ \)). - 不可以是Java的关键字(这点只要是有点基础的都会知道啦,Java的关键字还挺多的哦,小心踩到地雷呀). 下面是一个小栗子. /* *测试标识符的写法 */