name );} public static void GreetingEnglish( string name){Co

时间:2021-12-02 02:36:06

一、委托的观点

在我们学习委托之前,我们来了解下,什么是委托呢?

官方观点:委托是一种安适地封装要领的类型,它与 C 和 C++ 中的函数指针类似。与 C 中的函数指针差别,委托是面向东西的、类型安适的和保险的。委托的类型由委托的名称界说。

很多初学者都看不懂官方的观点,一脸懵逼。

举个例子吧:有几个小伙伴在外面玩,俄然有两小我私家手机忘记带了,并且两小我私家家距离很近,此中一小我私家想要骑车回去拿,另一个不想回去,就委托另一个帮他拿。

其实委托就是一个类型,它所实例化的变量就是委托类型的变量,也可以说委托是一个要领的模板,当我们去失delegate关键字的时候,就像是一个没有要领体的要领。

二、委托声明语法

delegate <return type> <delegate-name> <parameter list>

三、接下来我们来看下委托三部曲

public class MyDelegate { ////1、委托的声明 public delegate void NoReturnNopara(); public static void show() { //2、委托的实例化 NoReturnNopara method = new NoReturnNopara(Study); //3、委托的挪用 method.Invoke(); } public static void Study() { Console.WriteLine("正在学习delegate!"); } }

然后我们挪用show要领来看一个功效:

name );} public static void GreetingEnglish( string name){Co

功效没短处。

四、委托的用途

接下来我们来思考下,这样用委托有什么意义呢?还不如直接 MyDelegate.Study(); 这样。

固然我们学习委托并不是简单的像上面一样,上面只是为了便于我们学习了解委托而已。接下来我们来看一个打招呼的例子:

public class MyGreeting { public static void GreetingChinese(string name) { Console.WriteLine("{0},早上好",name); } public static void GreetingEnglish(string name) { Console.WriteLine("{0},good morning",name); } }

上面是中国人和外国人打招呼的方法,阿谁问题来了,我们怎么确定打招呼的人是中国人还中外国人呢?简单,我们界说一个枚举然后判断一个不就ok了嘛。

public class MyGreeting {public static void Greeting(string name,PeopleType type) { switch (type) { case PeopleType.Chinese: Console.WriteLine("{0},早上好", name); break; case PeopleType.English: Console.WriteLine("{0},good morning", name); break; } } } public enum PeopleType { Chinese, English }

这种做法满足了我们的需求。但是我们应该有所发明,这个要领的可扩展性很差,日后我们要是又有一个需求,要添加日本人打招呼,韩国人打招呼怎么办?我们就不得不改削枚举和Greeting这个要领内的代码,真是糟糕逶了。

那么,我们就应该想其它的要领来解决这个问题。从而到达”对扩展开方,对改削关闭“的原则。怎么实现呢?我们可以不管是哪国人,只卖力打招呼就好,将打招呼的逻辑做为参数。

首先,我们先界说一个打招呼的委托。

public delegate void DeleGreeting(string name);

然后将这个委托做为参数传给 Greeting(string name,DeleGreeting greeting)  这个要领,让这个要领来挪用打招呼。

public static void Greeting(string name,DeleGreeting greeting) { greeting.Invoke(name); }

最后,我们来实例化这个委托,,并挪用这个要领。