第07篇:C#星夜拾遗之delegate示例

概念

delegate即委托。如果你使用过C++或者js中的回调函数,你会更容易明白一些。在异步操作中常常使用回调函数,例如在Ajax中,当HttpRequest执行异步请求时,就需要有一个状态改变时的回调函数。回调函数其实是一个方法调用的指针,也称为函数指针。在C#中,当需要把方法作为参数进行传递时,就需要用到delegate。

 

简单委托示例

定义一个委托,代码如下:

private delegate string GetString();

这个委托用来获取一个字符串。接下来在Main方法中调用:

static void Main(string[] args)

{

    int i = 20;

//将i的ToString方法作为参数传递给委托

    GetString getString = new GetString(i.ToString);   

    Console.WriteLine(getString());     //执行委托

}

这是委托最简单的例子了,之所以上这么一个简单的例子,只是为了让大家明白,委托并不是深不可测。

 

多播委托

    所谓多播委托,其实就是可以通过 + 和 += 实现多个方法相加,同样可以通过 - 和 -= 实现方法相减。我们在Windows窗体编程中,为一个按钮添加单击事件,就可以看到这样的代码:

this.button1.Click += new System.EventHandler(this. button1_Click);

    通过多播委托我们可以为Click事件添加更多的处理函数,代码如下:

this.button1.Click += new System.EventHandler(this. button1_Click1);

 

如果想要删除一个方法,可以通过下面的代码实现:

this.button1.Click -= new System.EventHandler(this. button1_Click);

 

匿名方法

    匿名方法是用作委托参数的一个代码块。也就是说可以不对传给委托的方法命名,只需要将委托执行的代码写在一个指定的代码块中即可。下面的代码实现一个匿名方法的委托:

//这个委托定义说明,要执行的方法返回值为void,参数为string类型

private delegate void ShowString(string Text); 

 

static void Main(string[] args)

{

    string str = "这是一个匿名方法";

 

    ShowString ss = delegate(string Text)

    {

        Console.WriteLine(Text);

    };

    WriteString ws = new WriteString();

    ss += new ShowString(ws.write);

    ss.Invoke(str);

}

 

Lambda表达式

    C# 3.0中为匿名方法提供了一个新的语法:Lambda表达式。Lambda可用于委托类类型。想了解更多请参考MSDN中Lambda 表达式(C# 编程指南)

    下面是一个Lambda的例子,可以了解一下用法:

//这个委托定义说明,要执行的方法返回值为void,参数为string类型

private delegate void ShowString(string Text1, string Text2); 

 

static void Main(string[] args)

{

    string str1 = "第一个字符串";

    string str2 = "第二个字符串";

 

    // λ运算符 >= 左边列出委托需要的参数,如果为一个参数,可以省略()

    ShowString ss = (Text1, Text2) =>                      

    {

        // 运算符右侧为 方法或匿名方法,如果方法只有一行时可以省略 {}

        Console.WriteLine(Text1 + "\n" + Text2);

    };

 

    ss(str1, str2);

}

 

 

结束语

最后,还是那句老话,如果希望了解更多,还是多用,多查。实践是走向成功的必由之路。在最后的最后,提供出来本文示例的下载SampleDelegateTest.rar

如果认为此文对您有帮助,别忘了支持一下哦!

作者:齐飞

来源:http://youring2.cnblogs.com/

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

转载:http://www.cnblogs.com/youring2/archive/2010/05/16/1736509.html

时间: 2024-10-26 05:54:42

第07篇:C#星夜拾遗之delegate示例的相关文章

第03篇:C#星夜拾遗之语法基础

了解C#的基本语法,这是学习一门语言的必经之路.这些基本语法包括:数据类型.运算符和表达式.流程控制.字符串.类和对象.结构和枚举.命名空间等.本文主要列举出来笔者觉得算得上基础知识的内容.对于本文中的一些内容的详细讲解,可以参照anytao的博文系列:你必须知道的.NET     特别说明:本文多为网上摘抄或者之前的笔记,存在一定的不连贯,读者可以根据自己的实际情况,在百度或者Bing中查找更好的文章.   数据类型     值类型和引用类型的区别:值类型存放在栈(heap)中,引用类型存放在

NET下RabbitMQ实践 [配置篇]

这个系列目前计划写四篇,分别是配置,示例,WCF发布,实战.当然不排除加餐情况. 介绍: rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器. RabbitMQ的官方站:http://www.rabbitmq.com/          AMQP(高级消息队列协议) 是一个异步消息传递所使用的应用层协议规范,作为线路层协议,而不是API(例如JMS),AM

一起谈.NET技术,NET下RabbitMQ实践 [配置篇]

     这个系列目前计划写四篇,分别是配置,示例,WCF发布,实战.当然不排除加餐情况.      介绍:      rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器.      RabbitMQ的官方站:http://www.rabbitmq.com/          AMQP(高级消息队列协议) 是一个异步消息传递所使用的应用层协议规范,作为线路

用Apache Spark进行大数据处理—入门篇

文章讲的是用Apache Spark进行大数据处理-入门篇,Apache Spark 是一个围绕速度.易用性和复杂分析构建的大数据处理框架.最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一. 与Hadoop和Storm等其他大数据和MapReduce技术相比,Spark有如下优势. 首先,Spark为我们提供了一个全面.统一的框架用于管理各种有着不同性质(文本数据.图表数据等)的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求. Sp

PHP常用算法和数据结构示例(必看篇)

实例如下: </pre><pre name="code" class="php"><?php /** * Created by PhpStorm. * User: qishou * Date: 15-8-2 * Time: 上午9:12 */ header("content-type:text/html;charset=utf-8"); $arr = array(3,5,8,4,9,6,1,7,2); echo im

Android实现导航菜单左右滑动效果

今天给大家介绍在Android中实现顶部导航菜单左右滑动效果的二种解决方案. 第一种解决方案:  在以前的一篇博文中我使用android-support-v4.jar实现了左右滑动指引效果,有兴趣的朋友可以查看: http://www.cnblogs.com/hanyonglu/archive/2012/04/07/2435589.html    那么今天第一个示例我仍然使android-support-v4.jar来实现菜单左右滑动效果,关于这个包的信息,不再详述,大家可以查看官方文档. 实现

ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也要感谢大家了,因这个项目我已经上传了,得到了很多网友的评价,也有好多人发邮件给我说这个框架容易出现问题,不能访问,这也是支持我写这个系列的动力,我将这个项目写成一个系列,可能要很长时间吧,但是我肯定会一直坚持,如果我哪里写的不好欢迎大家指出我们共同学习,而且我理解的也不是很透彻,所以我想在写这样一遍

Minor GC、Major GC和Full GC之间的区别(转)

在 Plumbr 从事 GC 暂停检测相关功能的工作时,我被迫用自己的方式,通过大量文章.书籍和演讲来介绍我所做的工作.在整个过程中,经常对 Minor.Major.和 Full GC 事件的使用感到困惑.这也是我写这篇博客的原因,我希望能清楚地解释这其中的一些疑惑. 文章要求读者熟悉 JVM 内置的通用垃圾回收原则.堆内存划分为 Eden.Survivor 和 Tenured/Old 空间,代假设和其他不同的 GC 算法超出了本文讨论的范围. Minor GC 从年轻代空间(包括 Eden 和

Oracle ACFS、ADVM

Oracle ACFS.ADVM 配置Oracle ACFS集群文件系统 首先来看下,神马是ACFS,请看oracle官方给出的定义: Oracle Automatic Storage Management Cluster File System (Oracle ACFS) is a multi-platform, scalable file system, and storage management technology that extends Oracle Automatic Stora