委托(delegate)也可以看成是一种数据类型,可以用于定义变量,但它是一种特殊的数据类型,所定义的变量能接收的数值只能是个函数,更确切地说,委托类型的变量可以接收一个函数的地址。

简单地说

委托变量可看成是一种类型安全的函数指针,他只能接收符合其要求的函数地址。

示例:

public class MathOpt
{
public int Add(int argument1,int argment2)
{
return argument1+argment2;
}
} public delegate int MathOptDelegate(int value1,int value2); class Program
{
static void Main(string[] args)
{
MathOptDelegate oppDel;
MathOpt obj=new MathOpt();
oppDel=obj.Add;
Console.WriteLine(oppDel(,));
}
}

委托变量接收一个对象的方法引用。赋值之后的委托变量可以当成普通函数一样使用。

委托可以看成一个函数“容器”,将某一具体的函数“装入”后,就可以把它当成函数一样使用。

定义委托类型时对函数的要求被称为函数的“签名(signature)”。

函数的签名规定了函数的参数数目和类型,以及函数的返回值,体现了函数的本质特征。

每个委托都确定了一个函数的签名。拥有不同签名的函数不能赋值给同一类型的委托变量。

因此,委托类型的变量,可以引用任何一个满足其要求的函数。

委托变量可以代表某一函数,使用委托变量就相当于调用一个函数,如果仅是这么简单。那么直接调用函数不就行了吗?为什么还要引入“委托”这一特性呢?

事实上,委托不仅可以代表一个函数,还可以组合“一堆”函数,然后批量执行他们。

如:

//定义一个委托
delegate void MyDalegate(string s); //定义一个类 存在两个静态方法
class MyClass
{
public static void Hello(string s)
{
Console.WriteLine("您好,{0}!",s);
}
public static void GoodBye(string s)
{
Console.WriteLine("再见,{0}!",s);
}
} class Program
{
static void Main(string[] args)
{
MyDalegate a,b,c,d; //创建引用Hello方法的委托对象 a:
a=MyClass.Hello;
Console.WriteLine("调用委托变量 a:");
a("a"); //创建引用GoodBye方法的委托对象 b:
b=MyClass.GoodBye;
Console.WriteLine("调用委托变量 b:");
b("b");
//a和b两个委托成c
c=a+b;
Console.WriteLine("调用委托变量 c:");
c("c=a+b"); //从委托c中移除a,只留下b,用d代表移除结果
d=c-a;
Console.WriteLine("调用委托变量 d:");
d("d=c-a");
  }
}

因为上述代码中委托变量c组合了委托变量a和b,当执行“c“c(a+b)”;”时,导致MyClass的两个静态函数都被执行

像c这种委托变量又称为“多路委托变量

运行结果:

调用委托变量 a:
您好,a!
调用委托变量 b:
再见,b!
调用委托变量 c:
您好,c=a+b!
再见,c=a+b!
调用委托变量 d:
再见,d=c-a!

C#编程语言与面向对象——委托的更多相关文章

  1. C#编程语言与面向对象——抽象基类与接口

    在一个类前加“abstract”关键字,此类就成为抽象类. 对应的,在一个方法前加“abstract”关键字,此方法就成为抽象方法. abstract class Fruit //抽象类 { publ ...

  2. C#编程语言与面向对象——继承

    现实生活中的事物都归属于一定的类别,比如,狮子是一种(IS_A)动物,为了在计算机中模拟这种关系,面向对象的语言引入了继承(inherit)特性. 构成继承关系的两个类中,Animal称为父类(par ...

  3. C#编程语言与面向对象——类与对象

    由于ASP.NET技术是全面向对象的,因此,要掌握这一技术,必须具备有扎实的面向对象理论基础 使用C#编程,所有的程序代码几乎都放在类中,不存在独立于类中之外的函数,因此,类是面向对象编程的基本单元 ...

  4. C#编程语言与面向对象——核心

    面向对象的核心 (1).封装 封装的类=数据+对此数据所进行的操作(即算法) 封装起外界不必需要知道的东西,指向外界展现可供展示的东西. 小到一个简单的数据结构,大到一个完整的软件子系统.静态的如某软 ...

  5. 面向对象 委托变量和this的使用

    委托方法: this的使用:

  6. C#编程语言与面向对象—— 多态

    多态编程的基本原理是: 使用基类或接口变量编程. 在多态编程中,基类一般都是抽象类,其中拥有一个或多个抽象方法,各个子类可以根据需要重写这些方法.或者使用接口,每个接口都规定了一个或多个抽象方法,实现 ...

  7. Bash 脚本编程语言中的美学与哲学

    我承认,我再一次地当了标题党.但是不可否认,这一定是一篇精华随笔.在这一篇中,我将探讨 Bash 脚本语言中的美学与哲学. 这不是一篇 Bash 脚本编程的教程,但是却能让人更加深入地了解 Bash ...

  8. C#面向对象设计模式纵横谈——1.面向对象设计模式与原则

    一:设计模式简介 每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心. ---- Christopher Alexander 软件设计领域设计模式: 设计模式描述了软件设计过 ...

  9. Python黑帽编程2.9 面向对象编程

    Python黑帽编程2.9 面向对象编程 我个人认为,计算机语言的发展,有两个方向,一个是从低到高的发展过程,在这个过程中,语言的思考和解决问题的方式是面向硬件的.硬件本质上处理的是信号,在此基础上, ...

随机推荐

  1. 用JS获取地址栏参数的方法(超级简单)

    方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) {      var reg = new RegExp("( ...

  2. 微信APP支付服务端开发Java版(一)

    一.准备工作 去微信开发者中心下载(扫码支付,里面的大部分代码是可以用的) https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11 ...

  3. Trie树-字典查找

    描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题: ...

  4. Access restriction: The type TaskTopicResolver is not accessible due to restrict

    Access restriction: The type TaskTopicResolver is not accessible due to restrict :  Eclipse 默认把这些受访问 ...

  5. Javascript生成随机数

    随机数在前后端都比较常用,用途也较广.这里记录一下前端的实现方法,代码比较简单,封装成函数可随时调用. 具体如下: function getRandNum(n){ return Math.floor( ...

  6. C#中DateTime.Now.ToString()

    项目开发中遇到一个问题:C#编写的SQL语句中有时间值,刚开始直接将DateTime.Now进行toString()处理,源代码调试程序运行正常. 然后我的电脑重装了系统,再次运行程序就报错“从字符串 ...

  7. Java InMemoryCache

    package pay.infrastructure.helper; import org.apache.commons.collections.MapIterator; import org.apa ...

  8. WPF环境下多点触屏开发的一些经验(转)

    本系列将介绍Multi-Touch(MT)多点触控技术的相关内容,使开发人员了解如何在Windows 平台中开发出具有MT 功能的应用程序.众所周知Windows 7 操作系统自身已经支持具有MT 功 ...

  9. 在VBA中新建工作簿

    用程序计算数据,得到不同公司.不同项目的数据结果,最终还要将每个公司的数据结果放在各自的单独文件中.这就需要在vba中新建.保存excel文件.掌握几个东西就能很熟练了:1.要想保存在当前目录下,需要 ...

  10. Fiddler-2 Fiddler抓包原理

    1 fiddler抓包是在 客户端和服务器之间建立一个代理服务器,监听本机发出的请求和服务器返回的响应结果. 截一张官网的图: 2 启动fiddler之前,[dinghanhua]先来看一下代理服务器 ...