在说事件之前得先了解委托。
委托,外表看来和C/C++中函数指针没什么区别,但是本质上你才发现他其实就是个类!也就是说理解委托得从
这个两个方面去理解(单从一个方面去理解感觉就怪怪的呵呵!)

理解委托:
什么是委托?委托是c#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针。
声明一个委托,相当于声明了一个是函数指针类型,委托是一种类型,进一步说,他就是一个类!
他的目的就是,将方法可以作为其他方法的参数传递!进一步说,就是一个方法内部需要调用另一种方法
(及方法内部还有一个方法),且这个内部调用的方法存在多样性。那么最好的方法就是将内部的方法作为外
部的方法的参数数进行传参~~

委托的形式:
    声明委托的方式:delegate 返回值类型 委托类型名(参数)
比如delegate void deleProcess(string s);
注意这里的除了前面的delegate,剩下部分和声明一个函数一样,但是deleProcess不是函数名,而是委托类型名!

委托的使用:
      委托是c#中,可以订阅一个或多个具有相同签名方法的函数指针。所以说委托的使用和函数指针的使用是差不多的。
把它想象成一个指针就知道怎么用了~~但是委托又不能完全的看成一个函数指针(本质上是个类),这是因为委托考虑到更多的安全性,
它需要存储特定方法的细节。所以,定义好委托后,还需要创建一个委托实例,才可以使用(以存储特定方法的细节)!
假设有一个函数是:void SayHi(String s); 这个正好和delegate void deleProcess(string s);这个委托的签名一致。
那么我们开始使用委托:
deleProcess pro = new deleProcess(SayHi);//实例化一个委托,并且用SayHi方法初始化它。
deleProcess pro = SayHi;  //这是上面的简写形式,编译器帮我们进行了new!看上去是直接与方法关联(看起来有指针的感觉呵呵),其实还是通过委托!
注意SayHi以及pro都没有带“括号”的这是应为如果带上括号就是方法的调用了。好了当委托指向方法成功之后。
pro(s)就和SayHi(s),达到同一个目的了。
最终的目的委托是为了方法作为方法的参数:
viod GreetPeople(string name, deleProcess pro)//这个GreetPeople方法,就利用了委托将方法作为参数了!
{
      pro(name);//pro用起来就和方法是一样的~~
}
如此就可以把SayHi方法作为参数传递了:
GreetPeople(song,SayHi);
//摘抄自《C#高级编程》
委托的一个特征是它们的类型是安全的,可以确保被调用的方法签名是正确的。
但有趣的是,它们不关心调用该方法的是什么类型的对象,甚至不考虑该方法
是静态方法,还是实例方法。
提示:
给定委托的实例可以表示任何类型的任何对象上的实例方法或静态方法——只要方法
的签名匹配于委托的签名即可。
//-------------------------------------------------------------------------------------------------------------
//委托使用的例子~~
delegate string ProcessDelegate(string s);
static void ProcessIntArray(ProcessDelegate p)
        {
            string[] values = new string[] { "aB","Cd"};
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = p(values[i]);
            }
            Console.WriteLine("处理后");
            foreach (string s in values)
            {
                Console.WriteLine(s);
            }
        }
编写函数,大写、小写、加引号
进一步体会:和直接调用函数的区别:用委托就可以指向任意的函数,哪怕是之前没定义的都可以,而不使用受限于那几种。

总结:C# 委托的全面理解的更多相关文章

  1. C#委托零基础理解

    C#委托零基础理解(转) 1,  为什么使用委托  2.什么是委托  3.委托如何使用 为什么使用委托? 委托是c#中非常重要的一个概念,使用委托使程序员可以将方法引用封装在委托对象内.然后可以将该委 ...

  2. C#委托之个人理解

    C#委托之个人理解   什么是委托 首先要知道什么是委托,用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西. 如何使用委托 在使用委托的时候,你可以像对待一个类一样对待它.即先 ...

  3. winform总结2> Action<> ,Action,func<>,委托相关的理解

    1,他们是什么: Action 封装一个方法,该方法不具有参数并且不返回值. Action<> 封装一个方法,该方法具有最多16个参数并且不返回值. func<> 封装一个具有 ...

  4. C#对委托的初步理解理解

    作为新手对委托的学习: 1.定义委托:委托实际上是一个类,在定义委托前就知道了方法的返回类型和方法的参数类型(可以把委托理解为只知道方法的返回类型和方法的参数类型,不知道方法体) public  de ...

  5. C#基础:对委托的简单理解

    在编程过程中,我们习惯把数据作为参数传递给方法(例:int a=int.Parse(“20”);).是否能将一个方法传递给另一个方法呢?是不是听起来有点奇怪!!! 线程大家应该熟悉吧,在计算机中并行运 ...

  6. C#委托,事件理解入门 (译稿)

    原文地址:http://www.codeproject.com/Articles/4773/Events-and-Delegates-Simplified 引用翻译地址:http://www.cnbl ...

  7. 深入理解C# 委托(delegate)-戈多编程

    今天来谈谈委托,深入理解委托,本文来自各大神经验总结. 1.委托是什么? 委托类型的声明与方法签名相似. 它有一个返回值和任意数目任意类型的参数,是一种可用于封装命名方法或匿名方法的引用类型. 委托类 ...

  8. C#委托的最简单入门和理解

      委托是.net语言中非常重要的一个概念,初学不太好理解也没有关系的,在一次一次的攻关后会领会到委托的精妙,可以说 .net 没有委托就没有后面更高级的事件,异步多线程等等特性的形成可能.所以一定要 ...

  9. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

随机推荐

  1. WebSocket实现web即时通信(后端nodejs实现)

    WebSocket实现web即时通信 一.首先看一下,HTTP.ajax轮询.long poll和WebSocket的区别: 1.HTTP 协议(短连接):一个 Request 一个 Response ...

  2. js-dom-动态创建html标签时,name属性的初始化问题

    当我们动态创建可包含Name属性的元素时,不能简单的使用赋值element.name = "..."来添加其Name, 而必须在创建Element时,使用document.crea ...

  3. 开发中解决Access-Control-Allow-Origin跨域问题的Chrome神器插件,安装及使用

    背景: 笔者在用cordova开发安卓程序的时候在安卓设备上不存在跨域问题,但是在浏览器端模拟调试的时候却出现了Access-Control-Allow-Origin跨域问题,报错如下 No 'Acc ...

  4. 编写脚本-SQL SERVER 用户权限分配

    USE   [TXM];GOCREATE USER  [WIN-JO\Administrator]FOR LOGIN  [WIN-JO\Administrator];GOEXEC sp_addrole ...

  5. __细看InnoDB数据落盘 图解 MYSQL

    http://hatemysql.com/?p=503 1.  概述 前面很多大侠都分享过MySQL的InnoDB存储引擎将数据刷新的各种情况.我们这篇文章从InnoDB往下,看看数据从InnoDB的 ...

  6. AD用户移除所属组

    AD用户移除所属组: $Membership = Get-ADPrincipalGroupMembership $Users $Membership.distinguishedName Remove- ...

  7. VS2015 调试 条件和操作设置

    vs 开发过程中,经常会遇到这样的场景: 例如有几千条数据,调试代码的时候需要在循环中走到name="A"的这条数据, 并且单步调试这条数据走完整个逻辑过程.这个时候调试的条件设置 ...

  8. 实现CTreeCtrl父子节点的联动选择

    本文实现了下面的功能: 当选中父节点时, 其所有子节点全部选中. 当取消选中父节点时, 其所以子节点全部取消选中. 点击子节点时, 根据子节点与其兄弟节点的选中状态, 自动设置父节点的选中状态. 通过 ...

  9. CentOS7中部署Showdoc

    目录 CentOS7中部署Showdoc 前置环境 部署 配置文件 解压安装包 添加启动服务 设置权限 运行安装 界面 CentOS7中部署Showdoc 文:铁乐与猫 前置环境 因为showdoc其 ...

  10. October 28th, 2017 Week 43rd Saturday

    All I ever wanted was a single thing worth fighting for. 我想要的只不过是一件能让我奋不顾身的事业. Stop complaining the ...