知识大全 C# 委托

Posted

篇首语:太斤斤计较的人,不适合恋爱,适合买菜。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C# 委托相关的知识,希望对你有一定的参考价值。

C# 委托  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  委托 是一种可以把引用存储为函数的类型 委托的声明非常类似于函数 但是不带函数体 且要用delegate关键字 委托的声明指定了一个返回类型和一个参数列表 在定义了委托之后 就可以定义该委托类型的变量 接着把这个变量初始化为与委托有相同返回类型和参数列表的函数引用 之后就可以运用委托变量调用这个函数 就像该变量是一个函数一样

  有了引用函数的变量之后 还可以执行不能用其他方式完成的操作

  将方法作为方法的参数  我们先不管这个标题如何的绕口 也不管委托究竟是个什么东西 来看下面这两个最简单的方法 它们不过是在屏幕上输出一句问候的话语:

  public void GreetPeople(string name)

  // 做某些额外的事情 比如初始化之类 此处略

  EnglishGreeting(name);

  

  public void EnglishGreeting(string name)

  Console WriteLine( Morning + name);

  

  暂且不管这两个方法有没有什么实际意义 GreetPeople用于向某人问好 当我们传递代表某人姓名的name参数 比如说 Jimmy 进去的时候 在这个方法中 将调用EnglishGreeting方法 再次传递name参数 EnglishGreeting则用于向屏幕输出 Morning Jimmy

  现在假设这个程序需要进行全球化 哎呀 不好了 我是中国人 我不明白 Morning 是什么意思 怎么办呢?好吧 我们再加个中文版的问候方法:

  public void ChineseGreeting(string name)

  Console WriteLine( 早上好 + name);

  

  这时候 GreetPeople也需要改一改了 不然如何判断到底用哪个版本的Greeting问候方法合适呢?在进行这个之前 我们最好再定义一个枚举作为判断的依据:

  public enum Language

  English Chinese

  

  public void GreetPeople(string name Language lang)

  //做某些额外的事情 比如初始化之类 此处略

  switch(lang)

  case Language English:

  EnglishGreeting(name);

  break;

  case Language Chinese:

  ChineseGreeting(name);

  break;

  

  

  OK 尽管这样解决了问题 但我不说大家也很容易想到 这个解决方案的可扩展性很差 如果日后我们需要再添加韩文版 日文版 就不得不反复修改枚举和GreetPeople()方法 以适应新的需求

  在考虑新的解决方案之前 我们先看看 GreetPeople的方法签名:

  public void GreetPeople(string name Language lang)

  我们仅看 string name 在这里 string 是参数类型 name 是参数变量 当我们赋给name字符串 jimmy 时 它就代表 jimmy 这个值;当我们赋给它 张子阳 时 它又代表着 张子阳 这个值 然后 我们可以在方法体内对这个name进行其他操作 哎 这简直是废话么 刚学程序就知道了

  如果你再仔细想想 假如GreetPeople()方法可以接受一个参数变量 这个变量可以代表另一个方法 当我们给这个变量赋值 EnglishGreeting的时候 它代表着 EnglsihGreeting() 这个方法;当我们给它赋值ChineseGreeting 的时候 它又代表着ChineseGreeting()方法 我们将这个参数变量命名为 MakeGreeting 那么不是可以如同给name赋值时一样 在调用 GreetPeople()方法的时候 给这个MakeGreeting 参数也赋上值么(ChineseGreeting或者EnglsihGreeting等)?然后 我们在方法体内 也可以像使用别的参数一样使用MakeGreeting 但是 由于MakeGreeting代表着一个方法 它的使用方式应该和它被赋的方法(比如ChineseGreeting)是一样的 比如:

  MakeGreeting(name);

  好了 有了思路了 我们现在就来改改GreetPeople()方法 那么它应该是这个样子了:

  public void GreetPeople(string name *** MakeGreeting)

  MakeGreeting(name);

  

  注意到 *** 这个位置通常放置的应该是参数的类型 但到目前为止 我们仅仅是想到应该有个可以代表方法的参数 并按这个思路去改写GreetPeople方法 现在就出现了一个大问题:这个代表着方法的MakeGreeting参数应该是什么类型的?

  NOTE:这里已不再需要枚举了 因为在给MakeGreeting赋值的时候动态地决定使用哪个方法 是ChineseGreeting还是 EnglishGreeting 而在这个两个方法内部 已经对使用 morning 还是 早上好 作了区分

  聪明的你应该已经想到了 现在是委托该出场的时候了 但讲述委托之前 我们再看看MakeGreeting参数所能代表的 ChineseGreeting()和EnglishGreeting()方法的签名:

  public void EnglishGreeting(string name)

  public void ChineseGreeting(string name)

  如同name可以接受String类型的 true 和 但不能接受bool类型的true和int类型的 一样 MakeGreeting的 参数类型定义 应该能够确定 MakeGreeting可以代表的方法种类 再进一步讲 就是MakeGreeting可以代表的方法 的 参数类型和返回类型

  于是 委托出现了:它定义了MakeGreeting参数所能代表的方法的种类 也就是MakeGreeting参数的类型

  NOTE:如果上面这句话比较绕口 我把它翻译成这样:string 定义了name参数所能代表的值的种类 也就是name参数的类型

  本例中委托的定义:

  public delegate void GreetingDelegate(string name);

  可以与上面EnglishGreeting()方法的签名对比一下 除了加入了delegate关键字以外 其余的是不是完全一样?

  现在 让我们再次改动GreetPeople()方法 如下所示:

  public void GreetPeople(string name GreetingDelegate MakeGreeting)

  MakeGreeting(name);

  

  如你所见 委托GreetingDelegate出现的位置与 string相同 string是一个类型 那么GreetingDelegate应该也是一个类型 或者叫类(Class) 但是委托的声明方式和类却完全不同 这是怎么一回事?实际上 委托在编译的时候确实会编译成类 因为Delegate是一个类 所以在任何可以声明类的地方都可以声明委托 更多的内容将在下面讲述 现在 请看看这个范例的完整代码:

  using System;

  using System Collections Generic;

  using System Text;

  namespace Delegate

  //定义委托 它定义了可以代表的方法的类型

  public delegate void GreetingDelegate(string name);

  class Program

  private static void EnglishGreeting(string name)

  Console WriteLine( Morning + name);

  

  private static void ChineseGreeting(string name)

  Console WriteLine( 早上好 + name);

  

  //注意此方法 它接受一个GreetingDelegate类型的方法作为参数

  private static void GreetPeople(string name GreetingDelegate MakeGreeting)

  MakeGreeting(name);

  

  static void Main(string[] args)

  GreetPeople( Jimmy Zhang EnglishGreeting);

  GreetPeople( 张子阳 ChineseGreeting);

  Console ReadKey();

  

  

  

  输出如下:

  Morning Jimmy Zhang

  早上好 张子阳

  我们现在对委托做一个总结:

cha138/Article/program/net/201311/12832

相关参考

知识大全 C#委托的同步调用和异步调用

C#委托的同步调用和异步调用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  对于C#委托我们谈的

知识大全 学C#委托的时候有点摸不著头脑

学C#委托的时候有点摸不著头脑  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  刚开始学到委托的时

知识大全 菜鸟入门认识C#中的委托和事件教程

菜鸟入门认识C#中的委托和事件教程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  引言 

知识大全 C#使用委托调用实现用户端等待闪屏

C#使用委托调用实现用户端等待闪屏  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb

知识大全 .NET 委托

.NET委托  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  委托类型定义  C#编译器处理委托时

知识大全 一个关于C#的睡前故事[2]

NET委托:一个关于C#的睡前故事[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 一个关于C#的睡前故事[3]

NET委托:一个关于C#的睡前故事[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 一个关于C#的睡前故事[1]

NET委托:一个关于C#的睡前故事[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

电话转委托与电话自动委托的区别

电话转委托与电话自动委托的区别电话转委托是投资者通过电话委托营业部工作人员中转后进入证交所,营业部根据电话委托内容代为填写委托书,委托人应于成交后办理交割时补行签章;电话自动委托则是营业部将其电脑交易

股票交易的委托

股票交易的委托(一)委托买卖的方式委托人可以采用当面委托、电话、电报、书信等方式,委托证券公司进行买卖。当面委托是指委托人直接到证券公司,当面以口头形式委托证券公司的办事人员代为买卖,或者填写委托书交