委托(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. Bootstrap<基础十三> 按钮组

    按钮组允许多个按钮被堆叠在同一行上.当你想要把按钮对齐在一起时,这就显得非常有用.你可以通过Bootstrap 按钮(Button) 插件 添加可选的 JavaScript 单选框和复选框样式行为. ...

  2. 在 ASP.NET 中创建数据访问和业务逻辑层(转)

    .NET Framework 4 当在 ASP.NET 中处理数据时,可从使用通用软件模式中受益.其中一种模式是将数据访问代码与控制数据访问或提供其他业务规则的业务逻辑代码分开.在此模式中,这两个层均 ...

  3. 启动Tomcat一闪而过——分析及解决过程

    启动Tomcat一闪而过--分析及解决过程 嗯,昨天将有关JDK的知识稍微整理了一下,现在稍微整理一下有关Tomcat的! 1:Tomcat是什么? Tomcat是当今世界上使用最为广泛的.开源免费的 ...

  4. RTTI

    RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型.   编辑本段RTTI介绍 RTTI提 ...

  5. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  6. centos6.5 redmine 安装

    安装成功redmine信息 Redmine 2.6.0.stable   Environment:   Redmine version                2.6.0.stable   Ru ...

  7. css3旋转

    首先创建一个容器如div,然后设置其相关的3d属性,主要是三个1.perspective 透视,值越小3D感越强,值越大视觉正常.2.perspective-origin,透视点一般居于容器的中心.3 ...

  8. [linux-内核][转]内核日志及printk结构浅析

    这段时间复习了一下内核调试系统,注意看了一下printk的实现以及内核日志的相关知识,这里做一下总结. 1.问题的引出: 做DPDK项目时,调试rte_kni.ko时,发现printk并不会向我们想想 ...

  9. NC台网震相走时获取及 HYPOINVERSE 格式读取

    HYPOINVERSE格式介绍:http://www.ncedc.org/ftp/pub/doc/man5/ncsn.phase.5 获取网站: http://www.ncedc.org/ncedc/ ...

  10. RDF和Jena RDF API简介

    这是官方文章<An Introduction to RDF and the Jena RDF API>的译文.原文是在刺猬的温驯这里看到的.其中的图片没法显示了,还有一段丢失了.于是我在此 ...