委托(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 ...
随机推荐
- Python所有的错误都是从BaseException类派生的,常见的错误类型和继承关系
https://docs.python.org/2/library/exceptions.html#exception-hierarchy BaseException +-- SystemExit + ...
- sql in按照指定顺序排序
如下 Select * FROM table1 ,,,,) order by field (3,5,1,4,2)
- gFTP的安装与使用
gFTP是X Window下的一个用Gtk开发的多线程FTP客户端工具,它与Microsoft Windows下运行的CuteFTP等FTP工具极为类似.本文介绍了gFTP的编译.安装.启动及使用方法 ...
- AngularJS性能优化
几个概念 域$scope和更新周期DigestCycle AngularJS的域本质上是一些JavaScript对象,它们从一些预定义的对象继承而来.基本上,小的域比大的域运行要快. 每创建一个新的域 ...
- org.eclipse.ui.menus扩展点学习
Eclipse菜单: menu:help?after=addtions menu:navigate?after=open.ext2 menu:window?after=newEditor menu:f ...
- [转]html5 js 访问 sqlite 数据库的操作类
本文转自:http://blog.csdn.net/tsxw24/article/details/7613815 webkit 核心的浏览器提供了 3个 api接口,用于访问本地sqlite数据,但使 ...
- JAVA IO 以及 NIO 理解
由于Netty,了解了一些异步IO的知识,JAVA里面NIO就是原来的IO的一个补充,本文主要记录下在JAVA中IO的底层实现原理,以及对Zerocopy技术介绍. IO,其实意味着:数据不停地搬入搬 ...
- GitHub 下载文件夹
工具 TortoiseSVN 步骤 1.打开要下载的项目,选中要下载的文件夹,右键 选择 复制链接地址 2.把链接中的 tree/master 改成 trunk ,(trunk是master分支,可以 ...
- MVC5 条件查询异步刷新
学校要做一个数据查询,按条件并且能下载 20160312 使用HTML.ajax异步刷新 视图层 @Html.Partial("_men") <div class=&quo ...
- Location 对象
Location 对象 Location 对象包含有关当前 URL 的信息. Location 对象是 window 对象的一部分,可通过 window.Location 属性对其进行访问. 注意: ...