C# 委托(Delegate)

  C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。

  委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。

  声明委托(Delegate)

  委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。

  例如,假设有一个委托:

  public delegate int MyDelegate (string s);

  上面的委托可被用于引用任何一个带有一个单一的 string 参数的方法,并返回一个 int 类型变量。

  声明委托的语法如下:

  delegate

  实例化委托(Delegate)

  一旦声明了委托类型,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有参数。例如:

  public delegate void printString(string s);

  ...

  printString ps1 = new printString(WriteToScreen);

  printString ps2 = new printString(WriteToFile);

  下面的实例演示了委托的声明、实例化和使用,该委托可用于引用带有一个整型参数的方法,并返回一个整型值。

  using System;

  delegate int NumberChanger(int n);

  namespace DelegateAppl

  {

  class TestDelegate

  {

  static int num = 10;

  public static int AddNum(int p)

  {

  num += p;

  return num;

  }

  public static int MultNum(int q)

  {

  num *= q;

  return num;

  }

  public static int getNum()

  {

  return num;

  }

  static void Main(string[] args)

  {

  // 创建委托实例

  NumberChanger nc1 = new NumberChanger(AddNum);

  NumberChanger nc2 = new NumberChanger(MultNum);

  // 使用委托对象调用方法

  nc1(25);

  Console.WriteLine("Value of Num: {0}", getNum());

  nc2(5);

  Console.WriteLine("Value of Num: {0}", getNum());

  Console.ReadKey();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  Value of Num: 35

  Value of Num: 175

  委托的多播(Multicasting of a Delegate)

  委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。

  使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播(multicasting),也叫组播。下面的程序演示了委托的多播:

  using System;

  delegate int NumberChanger(int n);

  namespace DelegateAppl

  {

  class TestDelegate

  {

  static int num = 10;

  public static int AddNum(int p)

  {

  num += p;

  return num;

  }

  public static int MultNum(int q)

  {

  num *= q;

  return num;

  }

  public static int getNum()

  {

  return num;

  }

  static void Main(string[] args)

  {

  // 创建委托实例

  NumberChanger nc;

  NumberChanger nc1 = new NumberChanger(AddNum);

  NumberChanger nc2 = new NumberChanger(MultNum);

  nc = nc1;

  nc += nc2;

  // 调用多播

  nc(5);

  Console.WriteLine("Value of Num: {0}", getNum());

  Console.ReadKey();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  Value of Num: 75

  委托(Delegate)的用途

  下面的实例演示了委托的用法。委托 printString 可用于引用带有一个字符串作为输入的方法,并不返回任何东西。

  我们使用这个委托来调用两个方法,第一个把字符串打印到控制台,第二个把字符串打印到文件:

  using System;

  using System.IO;

  namespace DelegateAppl

  {

  class PrintString

  {

  static FileStream fs;

  static StreamWriter sw;

  // 委托声明

  public delegate void printString(string s);

  // 该方法打印到控制台

  public static void WriteToScreen(string str)

  {

  Console.WriteLine("The String is: {0}", str);

  }

  // 该方法打印到文件

  public static void WriteToFile(string s)

  {

  fs = new FileStream("c:\\message.txt",

  FileMode.Append, FileAccess.Write);

  sw = new StreamWriter(fs);

  sw.WriteLine(s);

  sw.Flush();

  sw.Close();

  fs.Close();

  }

  // 该方法把委托作为参数,并使用它调用方法

  public static void sendString(printString ps)

  {

  ps("Hello World");

  }

  static void Main(string[] args)

  {

  printString ps1 = new printString(WriteToScreen);

  printString ps2 = new printString(WriteToFile);

  sendString(ps1);

  sendString(ps2);

  Console.ReadKey();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  The String is: Hello World

  本文转载自:w3cschool(编辑:雷林鹏 来源:网络)

雷林鹏分享:C# 委托(Delegate)的更多相关文章

  1. 雷林鹏分享:C# 事件(Event)

    C# 事件(Event) 事件(Event) 基本上说是一个用户操作,如按键.点击.鼠标移动等等,或者是一些出现,如系统生成的通知.应用程序需要在事件发生时响应事件.例如,中断.事件是用于进程间通信. ...

  2. 雷林鹏分享:C# 泛型(Generic)

    C# 泛型(Generic) 泛型(Generic) 允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候.换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法 ...

  3. 雷林鹏分享:C# 匿名方法

    C# 匿名方法 我们已经提到过,委托是用于引用与其具有相同标签的方法.换句话说,您可以使用委托对象调用可由委托引用的方法. 匿名方法(Anonymous methods) 提供了一种传递代码块作为委托 ...

  4. 雷林鹏分享: C# 简介

    C# 简介 C# 是一个现代的.通用的.面向对象的编程语言,它是由微软(Microsoft)开发的,由 Ecma 和 ISO 核准认可的. C# 是由 Anders Hejlsberg 和他的团队在 ...

  5. 雷林鹏分享:C# 数据类型

    C# 数据类型 在 C# 中,变量分为以下几种类型: 值类型(Value types) 引用类型(Reference types) 指针类型(Pointer types) 值类型(Value type ...

  6. 雷林鹏分享:CodeIgniter 数据库操作

    在平时项目开发过程中,除了处理那些繁琐的逻辑过程外,还有一个重要的任务就是对数据库的操作处理.这里总结下自己平时使用CI过程中使用的如何对数据库进行操作处理. 在CI框架中,我们一般会把对数据库的操作 ...

  7. 雷林鹏分享:YAF路由问题

    这2天休年假,在家宅着学习研究了YAF框架,用YAF做过APP接口的项目,但是没有用来做过WEB方面的应用.趁着这2天在家想把博客用YAF进行一下改版,目的也想进一步学习一下YAF. 在这过程中遇到不 ...

  8. 雷林鹏分享:url中加号引发的错误

    刚发现了博客的一个bug,标签页中一些标签带有空格,在url输出中使用了 urlencode 函数进行处理,导致空格被转换成了加号(+),这时通过url访问时会出现错误: 临时解决方法是在urlcod ...

  9. 雷林鹏分享:Composer 安装

    下午在安装 Laravel 框架过程中,遇到了不少问题,因为 Laravel 的安装依赖于 composer,这里就先介绍一下 composer 的安装方法: 安装方法: #下载 sudo curl ...

随机推荐

  1. CoreSight介绍篇

    ARM的嵌入式IDE发展: 1)SDT,英文全称ARM SoftWare Development Kit,是ARM为方便用户在ARM芯片进行应用软件开发而推出的一整套开发工具. 2)ADS,英文全称A ...

  2. n的相反数

    实例十:n的相反数 方法:result=(~n)+1 正数 负数 原数 0000 0011   1111 1111补码 1111 1100 0000 0010加一 1111 1011 0000 001 ...

  3. cf249D

    这题说的是给了一个n*m的网格,然后每个格子的点事黑色的或者是白色的然后每个点如图所示    然后只能用白点和图中给出的边建立三角形然后询问三角形的个数有多少个,这样说每个三角形的边必须是图中有的边, ...

  4. RocketMQ 集群搭建--双Master方案

    安装环境 jdk1.7 alibaba-rocketmq-3.2.6.tar.gz VM虚拟机redhat6.5-x64:192.168.1.201  192.168.1.202 Xshell4 部署 ...

  5. 在notepad++里面使用正则表达式替换掉所有行逗号前面内容

    需求:在notepad++里面使用正则表达式替换掉所有行逗号前面内容,一文本内容如下(只贴一小部分,实际上N多): 级别,層級程序,程式插件,外掛程式鼠标,滑鼠打印,列印打开,開啟博客,部落格联系,聯 ...

  6. 微信小程序新闻列表功能(读取文件、template模板使用)

    微信小程序新闻列表功能(读取文件.template) 不忘初心,方得始终.初心易得,始终难守. 在之前的项目基础上进行修改,实现读取文件内容作为新闻内容进行展示. 首先,修改 post.wxml 文件 ...

  7. Adobe9阅读器渗透攻击——20145301

    Adobe9阅读器渗透攻击 实验步骤: 在kali终端中开启msfconsole,输入命令use exploit/windows/fileformat/adobe_cooltype_sing,进入该漏 ...

  8. @Transactional引起的NullPointerException

    https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-Transactional-NullPointerException ...

  9. Linux必备知识

    一.Linux命令行常用快捷键 在企业工作中,管理Linux时—般不会直接采用键盘.显示器登录系统,而是会通过网络在远程进行管理,因此,需要通过远程连接具连接到Linux系统中.目前最常用的Linux ...

  10. Linux slab分配器【转】

    本文转载自:https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/ 良好的操作系统性能部分依赖于操作系统有效管理资源的能 ...