【c# 学习笔记】为什么要使用委托
上一章中我们可能会很疑惑,为什么需要委托?为什么不直接在MyMethod方法里直接调用Add方法,反而要实例化一个委托对象来完成调用呢?这岂不是自找麻烦吗?
当然,c#引入委托并不是自找麻烦。委托是c#最好的一个特性,它为后来的很多特性都打下了基础。委托使得一个方法可以作为另一个方法的参数进行传递,这就是委托最大的作用。如下例子:
例如我们要实现一个打招呼的方法,而每个国家打招呼的方式都不一样,刚开始我们可能会像下面这样实现打招呼的方法:
public void Greeting(string name,string language)
{
switch (language)
{
case "zh-cn":
ChineseGreeting(name);
break;
case "en-us":
EnglishGreeting(name);
break;
default:
EnglishGreeting(name);
break;
}
} public void EnglishGreeting(string name )
{
Console.WriteLine("Hello, " + name);
} public void ChineseGreeting(string name)
{
Console.WriteLine("你好, " + name);
}
若后续我们需要添加德国、日本等打招呼方法,就必须修改Greeting方法内的case语句,来适应新的需求,这样特别不方便。有了委托,我们就可以把函数作为参数,并像如下代码实现Greeting方法:
public delegate void GreetingDelegate(string name);
static void Main(string[] args)
{
//引入委托
Program p = new Program();
p.Greeting("小叶", p.ChineseGreeting);
p.Greeting("Tommy Li", p.EnglishGreeting);
Console.Read();
}
public void Greeting(string name,GreetingDelegate callback)
{
callback(name);
}
public void EnglishGreeting(string name)
{
Console.WriteLine("Hello, " + name);
}
public void ChineseGreeting(string name)
{
Console.WriteLine("你好, " + name);
}
如下,增加德国人打招呼:
class Program
{
public delegate void GreetingDelegate(string name); static void Main(string[] args)
{
//引入委托
Program p = new Program(); p.Greeting("小叶", p.ChineseGreeting); p.Greeting("Tommy Li", p.EnglishGreeting); p.Greeting("Ha Wa", p.GermanyGreeting); Console.Read(); } public void Greeting(string name,GreetingDelegate callback)
{
callback(name);
}
public void EnglishGreeting(string name)
{
Console.WriteLine("Hello, " + name);
} public void ChineseGreeting(string name)
{
Console.WriteLine("你好, " + name);
} public void GermanyGreeting(string name)
{
Console.WriteLine("Hallo, " + name);
}
}
【c# 学习笔记】为什么要使用委托的更多相关文章
- 委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式
引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录 ...
- C#学习笔记(26)——委托计算器
说明(2017-11-20 15:14:18): 1. 委托一直稀里糊涂的,有人说简单,有人说难,艹你们! 2. 其实主要是因为,平时不用委托也能解决大部分问题,所以都没有特意去用,网上也没有什么很好 ...
- C#学习笔记(34)——委托传值(回忆版)
说明(2018-4-6 20:31:03): 1. 昨天晚上看三层,看完第一天的最后一节,会员的修改和增加,感觉欲仙欲死,果断关机睡觉. 2. 上午搞了半天哈利波特的原版书epub的下载,结果都没发现 ...
- c#面向对象基础技能——学习笔记(五)委托技术在开发中的应用
委托 delegate 1.是一种全新的面向对象语言的特性: 2.开发事件驱动程序变得非常简单: 3.简化多线程难度. 理解委托:可以理解成一个方法的指针.(接收的变量是方法) 步骤: 1.声明委托, ...
- C#学习笔记(31)——委托窗体传值
说明(2017-11-23 19:31:53): 1. 关于委托和窗体传值,一下午在网上查阅了大量资料,基本就是CSDN的论坛和博客园的文章,大家都在举例子,烧水.鸿门宴,看评论说还看到过沙漠足球的, ...
- C#学习笔记(28)——委托排序(2)自定义排序
说明(2017-11-21 15:24:50): 1. 定义一个排序方法,参数是字符串数组,和委托.MySort(nums, string.Compare),调用时只需要更换里面的委托方法就行,或者直 ...
- C#学习笔记(27)——委托排序(1)
说明(2017-11-20 17:21:35): 1. 感觉难点都在冒泡排序上..貌似之前跳过去了没学啊!冒泡排序的精髓就在于,两两比较,最大的排到最后一位,再把前面的重新两两比较,把最大的排到倒数第 ...
- C#学习笔记(9)——委托(窗体传值)
说明(2017-5-30 11:38:06): 1. 窗体1传值到窗体2,只要实例化Form2,“Form2 frm2 = new Form2(txt1.Text)”,这里要给Form2加一个带参数的 ...
- C#学习笔记(8)——委托应用(显示,写入时间)
说明(2017-5-30 09:08:10): 1. 定义一个委托,public delegate void MyDel();无参数,无返回值. 2. 委托作为DoSth的参数,DoSth里面调用委托 ...
- C#学习笔记(7)——委托
说明(2017-5-29 22:22:50): 1. 语法:public delegate void mydel();这一句在类外面,命名空间里面. 2. 专门新建一个方法,参数是委托: public ...
随机推荐
- js中event.preventDefault()和 event.stopPropagation( ) 方法详解
event.preventDefault() 1.首先event.preventDefault()是通知浏览器不要执行与事件关联的默认动作,例如: 这里a标签的默认事件是跳转,这里我们告诉浏览器取消 ...
- &和&&,|和||的用法区别
&和&&的区别是,&会执行两边,不管第一个是否成立&&只会执行一边,如果第一个条件为假,则不会走第二个条件举例public class Test2{ p ...
- JDK8中好用的日期处理-LocalDate类-LocalTime-LocalDateTIme,mysql解决时区相差13小时的问题,日期格式器DateTimeFormatter
set global time_zone='+08:00'; set time_zone = '+08:00'; show variables like '%time_zone:'
- mongodb的权限操作
一.开启权限认证 1.windows下的mongodb开启权限认证 C:\Users\Administrator>sc delete MongoDB //原来创建的服务如果没有开启 则删除 [S ...
- Java基础系列 - equals和==的区别
package com.test7; public class test7 { public static void main(String[] args) { /** * 1.equals()比较的 ...
- 我的BO之数据保护
我的BO 1-我的BO之强类型 2-我的BO之数据保护 3-我的BO之状态控制 4-我的BO之导航属性 数据保护指什么 软件的运行离不开数据,数据一般存在对象中.这种对象在 Java 统称为 POJO ...
- Dubbo的SPI是个什么鬼
原文:https://mp.weixin.qq.com/s/bQc_tASkfsojlcd897kLtA # spi 是啥? spi,简单来说,就是 service provider interfac ...
- C# ASP.NET 控制windows服务的 开启和关闭 以及重启
用ASP.NET控制Windows服务的开启与关闭效果如图 代码 首页页面需要添加引用 页面的pageload中 实例化windows服务 protected void Page_Load(objec ...
- legend3---lamp.sh常用操作
legend3---lamp.sh常用操作 一.总结 一句话总结: 1.github上下载代码 2.修改项目数据库配置,修改文件权限等操作:chown -R apache:apache /data/w ...
- Mysql -- BLOB, TEXT, GEOMETRY or JSON column 'result' can't have a default value
执行上面的代码, 即可解决, 不过mysql重启之后还会有问题. 根本解决: 将mysql的配置文件中的sql_mode项 注释掉.