C#高级编程笔记 Delegate 的粗浅理解 2016年9月 13日
Delegate [重中之重] 委托
定义一:(参考)http://www.cnblogs.com/zhangchenliang/archive/2012/09/19/2694430.html
- 完全可以把delegate理解成C中的函数指针。 
 它允许你传递一个 类A 的 方法m 给另一个 类B 的对象,使得 类B 的对象能够调用这个 方法m ,说白了就是可以把方法当作参数传递。
 不过delegate和函数指针还是有点区别的,delegate有许多函数指针不具备的优点。
 首先:函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。
 在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。
 其次,与函数指针相 比,delegate是面向对象、类型安全、可靠的受控(managed)对象。
 也就是说,runtime能够保证delegate指向一个有效的方法, 你无须担心delegate会指向无效地址或者越界地址。
个人理解(利用原博主的源代码进行分析)
- 例一
namespace Jandar.Test.Yinxi{
 class DelegateTest{
 public delegate void CompareDelegate(int a,int b); public static void Compare(int a,int b){
 System.Console.WriteLine((a>b).ToString());
 }
 public static void Main(string[] args){
 CompareDelegate cd=new CompareDelegate(Compare);
 cd(,); //Compare(5,4);和上面两行的执行结果是一样的。
 }
 }
 }
首先我们来分析一下 例一 的堆栈调用过程
CompareDelegate cd=new CompareDelegate(Compare);
因为 CompareDelegate 是一个引用类型。所以这步执行的是在 堆中创建一个引用类型对象
接下来执行 cd(1,2);
我以图解来描述一下
接下来的例二和上例一差不多 ,以下也给出源代码
- namespace Jandar.Test.Yinxi 
 {
 public delegate void MyTestDelegate(int i);//use like interface public class DelegateTest
 {
 public static void Main()
 {
 RecieveDelegateArgsFuns(new MyTestDelegate(DelegateFunction));
 }
 public static void RecieveDelegateArgsFuns(MyTestDelegate func)
 {
 func();
 }
 public static void DelegateFunction(int i)
 {
 System.Console.WriteLine("传来的参数{0}",i);
 }
 }
 }
附上手稿
通过理解 .Net 中的OnClick 机制 来深入理解 Delegate
C#中的事件处理实际上是一种具有特殊签名的 delegate
public delegate void MyEventHandler(object sender, MyEventArgs e);
其中的两个参数,sender代表事件发送者,e是事件参数类。MyEventArgs类用来包含与事件相关的数据,所有的事件参数类都必须从 System.EventArgs类派生。当然,如果你的事件不含参数,那么可以直接用System.EventArgs类作为参数。(例子解释直接在代码中)
using System;
namespace Jandar.Test.YinXi
{
public class ButtonClickArgs : EventArgs
{
public string Clicker;//用来显示 操作对象。
}
public class MyButton
{
public delegate void ClickHandle(object sender, ButtonClickArgs e);//声明一个delegate的类型 public event ClickHandle OnClick;//定义事件,类型为 delegate 的ClickHandle对象;
public void Click()
{
OnClick(this, new ButtonClickArgs() { Clicker = "H" });////相当于 onClick中自带的 Invoke()方法,类似与 OnClick.Invoke(
//this, new ButtonClickArgs() { Clicker = "H" }
}
}
public class Program
{
public static void Main(string[] args)
{
MyButton btn = new MyButton();
btn.OnClick += new MyButton.ClickHandle(btn_OnClick);//注册时间,把btn_OnClick 方法绑定到 委托事件中。
btn.Click();//进行调用
}
public static void btn_OnClick(object sender, ButtonClickArgs e)
{
Console.WriteLine("Hello,MyWorld!");
}
}
}
定义二:(参考)http://www.cnblogs.com/idior/articles/100666.html
- 将Delegate理解为接口,只有一个方法的接口,这样最容易理解。这个方法只有声明,没有实现,实现在别的类。(实际上应该把它看作函数指针,不过接口更容易理解些。) 
 在你的类中有一个Delegate就相当于有一个接口。通过这个接口你可以调用一个方法,而这个方法在别的类定义,由别的类来干。
定义三:(参考)http://www.cnblogs.com/hyddd/archive/2009/07/26/1531538.html
- Delegate中文翻译为“委托”。Msdn中对Delegate的解释如下: C#中的委托类似于C或C++中的函数指针。使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码, 
 而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象、类型安全的,并且是安全的。
using System;
namespace Jandar.Test.YinXi{ class TestDelegate
{
public delegate void DelegateMethod(); //声明了一个Delegate Type public DelegateMethod delegateMethod; //声明了一个Delegate对象 public static void StaticMethod()
{
Console.WriteLine("Delegate a static method");
} public void NonStaticMethod()
{
Console.WriteLine("Delegate a non-static method");
} public void RunDelegateMethods()
{
if(delegateMethod != null){
Console.WriteLine("---------");
delegateMethod.Invoke(); //运行 delegateMethod所搭载的函数
Console.WriteLine("---------");
}
}
} class Program
{
static void OtherClassMethod(){
Console.WriteLine("Delegate an other class's method");
} static void Main(string[] args)
{
var test = new TestDelegate();
test.delegateMethod = new TestDelegate.DelegateMethod(test.NonStaticMethod);
test.delegateMethod += new TestDelegate.DelegateMethod(TestDelegate.StaticMethod);
test.delegateMethod += Program.OtherClassMethod;
test.RunDelegateMethods();
}
}
}
上面这个例子我觉得挺好的,体现了定义一种的 解释
它允许你传递一个 类A 的 方法m 给另一个 类B 的对象,使得 类B 的对象能够调用这个 方法m ,说白了就是可以把方法当作参数传递。
C#高级编程笔记 Delegate 的粗浅理解 2016年9月 13日的更多相关文章
- C#高级编程笔记 Day 5, 2016年9月 13日 (泛型)
		[重点]泛型:有了泛型,就可以创建独立于被包含类型的类和方法了.我们不必给不同的类型编写功能相同的许多方法和类,只创建一个方法或类即可,以下是泛型的特点:性能.类型安全性.二进制代码重用.代码的扩展. ... 
- WPF的学习笔记(1) -- (积累自2016年5月1日 至 2016年6月1日)
		敬告读者:因为是事件驱动模式的高速学习,高速学习意味着,不系统,不科学,不合逻辑,不一定正确.所以要是有不对的地方,页面下面留言给我,跪谢! 背景介绍: 最近在公司的开发工作中,接手了从别的公司交代过 ... 
- Android高级编程笔记(四)深入探讨Activity(转)
		在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ... 
- C#高级编程笔记 (6至10章节)运算符/委托/字符/正则/集合
		数学的复习,4^-2即是1/4/4的意思, 4^2是1*2*2的意思,而10^-2为0.01! 7.2运算符 符号 说明 例 ++ 操作数加1 int i=3; j=i++; 运算后i的值为4,j ... 
- UNIX环境高级编程笔记之文件I/O
		一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ... 
- javascript高级编程笔记01(基本概念)
		1.在html中使用JavaScript 1. <script> 元素 <script>定义了下列6个属性: async:可选,异步下载外部脚本文件. charset:可选, ... 
- C#高级编程笔记之第三章:对象和类型
		类和结构的区别 类成员 匿名类型 结构 弱引用 部分类 Object类,其他类都从该类派生而来 扩展方法 3.2 类和结构 类与结构的区别是它们在内存中的存储方式.访问方式(类似存储在堆上的引用类型, ... 
- C#高级编程笔记之第二章:核心C#
		变量的初始化和作用域 C#的预定义数据类型 流控制 枚举 名称空间 预处理命令 C#编程的推荐规则和约定 变量的初始化和作用域 初始化 C#有两个方法可以一确保变量在使用前进行了初始化: 变量是字段, ... 
- c#高级编程笔记----委托
		因为定义委托基本上是定义一个新类,所以可以在定义类的任何相同地方定义委托,也就是说,可以在另一个类的内部定义,也可以在任何类的外部定义,还可以在名称空间中把委托定义为顶层对象.根据定义的可见性,和委托 ... 
随机推荐
- http协议进阶(一)http概述
			参考书籍——<HTTP权威指南> 1.web客户端和服务器 http客户端发出请求,其中包含请求内容,发给服务器,服务器再返回内容中回送请求的数据,http客户端和服务器构成了万维网的基本 ... 
- iOS Photos.framework框架
			链接: iOS8.0 使用Photos.framework对相册的常用操作 iOS AssetsLibrary和Photos的使用总结: 权限及相册的获取 iOS 开发之照片框架详解 iOS Asse ... 
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 几十套业务系统集中统一授权管理实现经验分享
			由于这几年互联网电商的快速发展,快递公司也进入了快速发展的绝好快速成长期.随着社会的强劲需求公司的业绩年年攀新高.快速发展的公司都需要有强大的IT信息系统,硬件设备基本上款到了货也可以到了,但是软件系 ... 
- Js前端代码异常监控
			window.onerror = function(msg,url,line,col,error){ //没有URL不上报!上报也不知道错误 if (msg != "Script error ... 
- Apache Shiro系列三,概述 —— 10分钟入门
			一.介绍 看完这个10分钟入门之后,你就知道如何在你的应用程序中引入和使用Shiro.以后你再在自己的应用程序中使用Shiro,也应该可以在10分钟内搞定. 二.概述 关于Shiro的废话就不多说了 ... 
- WebForm路由踩坑 ajax请求多次
			WebForm路由踩坑 再次接触Asp.Net WebForm已是4年后的今天,源起新入职的公司,一个老的项目. Web接触的少,那就多动手写写. WebForm1.aspx <body> ... 
- 2015年3月阿里内推(c++研发)实习生电面经历
			2015年3月开学开始就听说阿里会有内推,果不其然在师兄的引荐下推了菜鸟网络,但是在学校的BBS上看到了阿里云部门,而且要会C++,这使我更感兴趣,重新选择了方向,当然最后选择了阿里云.在此分享一下三 ... 
- .Net开源微型ORM框架测评
			什么是ORM? 对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间 ... 
- 代码比较器 Araxis Merge
			Araxis Merge 是一个可视化的文件比较.合并和同步的软件,能够方便的被软件工程师和 web 站点开发者使用快速精确地比较.了解和联合不同版本的源文件:进行版本和质量控制,创建 HTML 或是 ... 
- Mysql索引PRIMARY、NORMAL、UNIQUE、FULLTEXT 区别和使用场合
			索引 数据库的索引就像一本书的目录,能够加快数据库的查询速度. MYSQL索引有四种PRIMARY.INDEX.UNIQUE.FULLTEXT, 其中PRIMARY.INDEX.UNIQUE是一类,F ... 
 
			
		

 
              