委托(delegate)
委托(dekegate)是一种动态调用方法的类型,与类、接口和数组相同,属于引用型,可以用来实现多路广播(MulticastDelegate)。
多路广播(MulticastDelegate):可以用"+""-"将多个委托对象合并、移除,可以使用"+="添加委托对象,"-="移除委托对象。
委托的特点:
1)委托类似于C++函数指针,但与指针不同的是,委托是完全面向对象的,是安全的数据类型;
2)委托允许将方法作为参数进行传递;
3)委托可用于定义回调方法;
4)委托可以把多个方法链接在一起。这样,在时间触发时,可同时启动多个时间处理程序。
委托的声明:
[访问修饰符] delegate 返回值类型 委托名([参数列表]);
public delegate int Calculate (int x, int y);
委托的实例化:
委托类型 委托变量名 = new 委托型构造函数 (委托要引用的方法名)
int Multiply (int x, int y)
{
return x * y;
} int Add(int x, int y)
{
return x + y;
} Calculate a = new Calculate(Multiply);
Calculate b = new Calculate(Add);
Calculate c = new Calculate(); c = a + b; //组合调用 c += new Calculate(Add); //添加委托对象 c -= a; //移除委托对象
其中,a,b为委托型对象。
由于实例化委托实际上是创建了一个对象,所以委托对象可以参与赋值运算,甚至作为方法参数进行传递。
使用委托:
Calculate calc = new Calculate(Add); int result = calc(,);
这里calc相当于调用了Add方法。
使用匿名方法:
从C# 2.0开始,引入了匿名方法的概念,允许将代码块作为参数传递,避免单独定义方法。
委托类型 委托变量名 = delegate ([ 参数列表 ]){代码块};
using System;
delegate void D(int x); //声明委托 class C
{
public static void M1(int i)
{
Console.WriteLine("C.M1: " + i);
}
public static void M2(int i)
{
Console.WriteLine("C.M2: " + i);
}
public void M3(int i)
{
Console.WriteLine("C.M3: " + i);
}
}
class Test
{
static void Main()
{
D cd1 = new D( C.M1);
cd1(-); // call M1
Console.WriteLine(); D cd2 = null;
cd2 += new D( C.M2);
cd2(-); // call M2
Console.WriteLine(); D cd3 = cd1 + cd2;
cd3(); // call M1 then M2
Console.WriteLine(); cd3 += cd1;
cd3(); // call M1, M2, then M1
Console.WriteLine(); C c = new C(); //委托相同与否的判断条件:函数体是否相同
D cd4 = new D(c.M3);
cd3 += cd4;
cd3(); // call M1, M2, M1, then M3
Console.WriteLine(); cd3 -= cd1; // remove last M1
cd3(); // call M1, M2, then M3
Console.WriteLine(); cd3 -= cd4;
cd3(); // call M1 then M2
Console.WriteLine(); cd3 -= cd2;
cd3(); // call M1
Console.WriteLine(); cd3 -= cd2; // impossible removal is benign
cd3(); // call M1
Console.WriteLine(); cd3 -= cd1; // invocation list is empty
Console.WriteLine( cd3 == null ); // cd3(70); // System.NullReferenceException thrown
cd3 -= cd1; // impossible removal
Console.WriteLine( cd3 == null ); Console.ReadKey(true);
}
}
运行结果:

委托(delegate)的更多相关文章
- [.NET] C# 知识回顾 - 委托 delegate (续)
		
C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...
 - [C#] C# 知识回顾 - 委托 delegate
		
C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...
 - C# 委托Delegate(一) 基础介绍&用法
		
本文是根据书本&网络 前人总结的. 1. 前言 定义&介绍: 委托Delegate是一个类,定义了方法的类型, 使得可以将方法当做另一个方法的参数来进行传递,这种将方法动态地赋给参数的 ...
 - 为什么不能把委托(delegate)放在一个接口(interface)当中?
		
stackoverflow上有人问,为什么不能把委托放在一个接口当中? 投票最多的第一个答案第一句话说,“A Delegate is just another type, so you don't g ...
 - C# 代理/委托 Delegate
		
本文转载自努力,努力,努力 1. 委托的定义:委托是函数的封装,它代表一"类"函数.他们都符合一定的签名:拥有相同的参数列表,返回值类型.同时,委托也可以看成是对函数的抽象,是函数 ...
 - c# 委托 delegate
		
委托是一种存储函数引用的类型,在事件和事件的处理时有重要的用途 通俗的说,委托是一个可以引用方法的类型,当创建一个委托,也就创建一个引用方法的变量,进而就可以调用那个方法,即委托可以调用它所指的方法. ...
 - 理解委托(delegate)及为什么要使用委托
		
理解委托(delegate)及为什么要使用委托 委托:是一种定义方法签名的类型. 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联. 您可以通过委托实例调用方法. 上述为官方说法,理解起来 ...
 - 深入理解委托(Delegate)
		
前言 委托其实一直以来都感觉自己应该挺熟悉的,直到最近又去翻了翻 CLR via C#,感觉我之前的理解可能还有失偏颇.在这记录一下. 之前文章的链接: 接口和委托的泛型可变性 C#高级编程笔记 De ...
 - C# -- 使用委托 delegate 执行异步操作
		
C# -- 使用委托 delegate 执行异步操作 委托是一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似. 与 C 中的函数指针不同,委托是面向对象的.类型安全的和保险的. 委托的 ...
 - 委托delegate
		
委托delegate没有函数体.委托可以指向函数(要与指向的函数格式.类型相一致) namespace demo { public delegate double MyDelegate(double ...
 
随机推荐
- SSH 整合及注意事项
			
Spring 整合 hibernate 配置 1. spring 配置管理datasource 及 sessionFactory 1) 引入相关jdbc配置文件. <context:proper ...
 - 《数据结构》之串的模式匹配算法——KMP算法
			
//串的模式匹配算法 //KMP算法,时间复杂度为O(n+m) #include <iostream> #include <string> #include <cstri ...
 - FFT,NTT 专题
			
学习傅里叶的基本性质及其代码,可以参考大神理解 还有 ACdream 的博客 贴一下NTT的模板: using namespace std; typedef long long ll; int n; ...
 - 带权图的最短路径算法(Dijkstra)实现
			
一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...
 - 第15章 设备无关位图_15.1 DIB文件格式
			
15.1 DIB文件格式(一种文件格式,扩展名为BMP) 15.1.1 OS/2风格的DIB 文件格式 字段 说明 文件头 (BITMAPFILEHEADER) 1.共14个字节 2.缩写建议用bmf ...
 - SQL部分 数据库的建立 增删改查
			
数据库: 结构化查询语言(Structured Query Language)简称SQL: 数据库管理系统(Database Management System)简称DBMS: 数据库管理员(Data ...
 - Linux混杂设备驱动学习
			
Linux混杂设备是字符设备的一类,主要是混杂设备拥有相同的主设备号(10),但是次设备号是不同的.所有的混杂设备行程一个链表,对设备访问时内核更据次设备号查找到相应的混杂设备. 混杂设备用struc ...
 - poj 2481
			
Cows Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 16163 Accepted: 5380 Description ...
 - Oracle 游标使用全解
			
-- 声明游标:CURSOR cursor_name IS select_statement --For 循环游标 --(1)定义游标 --(2)定义游标变量 --(3)使用for循环来使用这个游标 ...
 - Javascript 代码格式化(JsFormat)
			
JsFormat 在GitHub 上的地址: https://github.com/jdc0589/JsFormat 这是一个sublime text 2 的插件. 安装: 先安装 sublime p ...