C#编程语言与面向对象——委托
委托(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#编程语言与面向对象——委托的更多相关文章
- C#编程语言与面向对象——抽象基类与接口
在一个类前加“abstract”关键字,此类就成为抽象类. 对应的,在一个方法前加“abstract”关键字,此方法就成为抽象方法. abstract class Fruit //抽象类 { publ ...
- C#编程语言与面向对象——继承
现实生活中的事物都归属于一定的类别,比如,狮子是一种(IS_A)动物,为了在计算机中模拟这种关系,面向对象的语言引入了继承(inherit)特性. 构成继承关系的两个类中,Animal称为父类(par ...
- C#编程语言与面向对象——类与对象
由于ASP.NET技术是全面向对象的,因此,要掌握这一技术,必须具备有扎实的面向对象理论基础 使用C#编程,所有的程序代码几乎都放在类中,不存在独立于类中之外的函数,因此,类是面向对象编程的基本单元 ...
- C#编程语言与面向对象——核心
面向对象的核心 (1).封装 封装的类=数据+对此数据所进行的操作(即算法) 封装起外界不必需要知道的东西,指向外界展现可供展示的东西. 小到一个简单的数据结构,大到一个完整的软件子系统.静态的如某软 ...
- 面向对象 委托变量和this的使用
委托方法: this的使用:
- C#编程语言与面向对象—— 多态
多态编程的基本原理是: 使用基类或接口变量编程. 在多态编程中,基类一般都是抽象类,其中拥有一个或多个抽象方法,各个子类可以根据需要重写这些方法.或者使用接口,每个接口都规定了一个或多个抽象方法,实现 ...
- Bash 脚本编程语言中的美学与哲学
我承认,我再一次地当了标题党.但是不可否认,这一定是一篇精华随笔.在这一篇中,我将探讨 Bash 脚本语言中的美学与哲学. 这不是一篇 Bash 脚本编程的教程,但是却能让人更加深入地了解 Bash ...
- C#面向对象设计模式纵横谈——1.面向对象设计模式与原则
一:设计模式简介 每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心. ---- Christopher Alexander 软件设计领域设计模式: 设计模式描述了软件设计过 ...
- Python黑帽编程2.9 面向对象编程
Python黑帽编程2.9 面向对象编程 我个人认为,计算机语言的发展,有两个方向,一个是从低到高的发展过程,在这个过程中,语言的思考和解决问题的方式是面向硬件的.硬件本质上处理的是信号,在此基础上, ...
随机推荐
- 1745. Yet Another Answer
http://acm.timus.ru/problem.aspx?space=1&num=1745 题目大意: 可以是任意的顺序,在满足括号匹配的情况下,求组合成的字符串长度最长 思路: 先将 ...
- 【 2013 Multi-University Training Contest 1 】
HDU 4602 Partition f[i]表示和为i的方案数.已知f[i]=2i-1. dp[i]表示和为i,k有多少个.那么dp[i]=dp[1]+dp[2]+...+dp[i-1]+f[i-k ...
- [开发笔记]-未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService...匹配的导出【转载自:酷小孩】
原文地址:http://www.cnblogs.com/babycool/p/3199158.html 今天打算用VisualStudio2012做一个js效果页面测试的时候,打开VS2012新建项目 ...
- CentOS集群安装Tmux
对于Linux的常用者,如果你说你不会tmux,那你就out啦~ 1. 什么是Tmux? 先来看看Tmux长什么样. tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD ...
- 使用Python scipy linprog 线性规划求最大值或最小值(使用Python学习数学建模笔记)
函数格式 scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simp ...
- C/C++程序员常去网站
www.codeproject.comwww.codegru.comwww.chinaunix.netwww.csdn.netwww.vckbase.com http://www.google.com ...
- java多线程系列之 synchronized
一.synchronized基本原理 java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁. ...
- JS 日期格式化
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"& ...
- yum源的搭建
1.光盘的挂载 2.先创建一个文件 /aaa 然后挂载mount /dev/cdrom /aaa 进入 /aaa ls 查看是否挂载OK 3.进入yum文件夹.将除Media以外的所有文件名改为X ...
- iOS进阶之多线程
多线程 注意:iOS关于UI的刷新和添加必须在主线程中操作! pthread的创建方法: pthread_t pthread; //第一个参数 线程指针 //第二个参数 线程的一些属性 //第三个参数 ...