再谈委托

转自:http://www.cnblogs.com/hyddd/archive/2009/07/26/1531538.html#3183896

http://kb.cnblogs.com/page/50132/

http://www.csframework.com/archive/2/arc-2-20110617-1633.htm

http://blog.sina.com.cn/s/blog_5f30147a010111y1.html

http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html

http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx

ios中关于delegate(委托)的使用心得

http://blog.csdn.net/huifeidexin_1/article/details/7567731

http://bbs.9ria.com/thread-205585-1-1.html

C# 委托及各种写法

  • 委托是嘛?

委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法)。通俗的说,委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的对象,进而就可以调用那个方法,即委托可以调用它所指的方法。

  • 如何使用委托?

1、定义委托类型

[访问修饰符]delegate 返回类型 委托名(形参);

2、声明委托对象

委托名 委托实例名;

3、创建委托对象(确定与哪些方法进行绑定)

委托实例名=new 委托名(某个类的方法)

4、使用委托调用方法

委托实例名(实参)

  • 委托注意事项:

1、委托和方法必须具有相同的参数。

2、委托可以调用多个方法,即一个委托对象可以维护一个可调用方法的列表而不是单独的一个方法,称为多路广播(多播)。

3、使用+=和-=运算实现方法的增加和减少

  • 示例

using System;using System.Collections.Generic;using System.Linq;using System.Text;using Delegate;

namespace Delegate{

        public delegate int Call(int num1, int num2);//第一步:定义委托类型        class SimpleMath        {            // 乘法方法            public int Multiply(int num1, int num2)            {                return num1 * num2;            }

            // 除法方法            public int Divide(int num1, int num2)            {                return num1 / num2;            }        }    }    class Test    {        static void Main(string[] args)        {            Call objCall;//第二步:声明委托对象            // Math 类的对象            SimpleMath objMath = new SimpleMath();             // 第三步:创建委托对象,将方法与委托关联起来            objCall = new Call(objMath.Multiply);

            Call objCall1 = new Call(objMath.Divide);            objCall += objCall1;//向委托增加一个方法            //objCall -= objCall1;//向委托减去一个方法
            // 调用委托实例,先执行objMath.Multiply,然后执行objMath.Divide            int result = objCall(5, 3);            System.Console.WriteLine("结果为 {0}", result);            Console.ReadKey();        }    }

写法:

1、委托 委托名=new 委托(会调用的方法名); 委托名(参数);

2、委托 委托名 =会调用的方法名; 委托名(参数);

3、匿名方法

委托 委托名=delegate(参数){会调用的方法体};委托名(参数);

4、拉姆达表达式

委托 委托名=((参数1,。。参数n)=>{会调用的方法体});委托名(参数);

5、用Action<T>和Func<T>,第一个无返回值

Func<参数1, 参数2, 返回值> 委托名= ((参数1,参数2) => {带返回值的方法体 });返回值=委托名(参数1,参数2);

贴代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using @delegate;

namespace @delegate

{

        public delegate int Call(int num1, int num2);

        class SimpleMath

        {

            // 乘法方法

            public static int Multiply(int num1, int num2)

            {

                return num1 * num2;

            }

            // 除法方法

            public int Divide(int num1, int num2)

            {

                return num1 / num2;

            }

        }

    class Test

    {

        static void Main(string[] args)

        {

            //--------------------第一种写法------------------------//

            //Call objCall = new Call(SimpleMath.Multiply);

            //Call objCall1 = new Call(new SimpleMath().Divide);

            //--------------------第二种写法------------------------//

            //Call objCall = SimpleMath.Multiply;

            //Call objCall1 = new SimpleMath().Divide;

            //--------------------第三种写法------------------------//

            //Call objCall = delegate(int a, int b)

            //{

            //    return a * b;

            //};

            //Call objCall1 = delegate(int a, int b)

            //{

            //    return a / b;

            //};

            //--------------------第四种写法------------------------//

            //Call objCall =((int a,int b)=> { return a*b;});

            //Call objCall1 = ((int a, int b) => { return a / b; });

            //--------------------第五种写法------------------------//

            Func<int, int, int> objCall = ((a, b) => { return a * b; });

            Func<int, int, int> objCall1 = ((a, b) => { return a / b; });

             Action<int, int> ob = ((a, b) => { Console.WriteLine(a * b); });

             ob(5, 3);

            //----------------------------------------------------//

             int result = objCall(5, 3);

             int result1 = objCall1(5, 3);

             System.Console.WriteLine("结果1为 {0},结果2为{1}", result,result1);

            Console.ReadKey();

        }

    }

}

时间: 2024-11-04 14:53:55

再谈委托的相关文章

C++ Primer 学习笔记_73_面向对象编程 --再谈文本查询示例

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

C++ Primer 学习笔记_74_面向对象编程 --再谈文本查询示例[续/习题]

面向对象编程 --再谈文本查询示例[续/习题] //P522 习题15.41 //1 in TextQuery.h #ifndef TEXTQUERY_H_INCLUDED #define TEXTQUERY_H_INCLUDED #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <set> #include <map&g

再谈MySQL全库备份

再谈MySQL全库备份 简介 Part1:写在最前 在很早之前,我写过一个MySQL生产库全库备份脚本,今天有同事问我是不是要再加一个-R参数来备份存储过程,理由的话是由于mysqldump --help中 关于存储过程的默认备份是false. routines                          FALSE MySQL生产库全库备份脚本 http://suifu.blog.51cto.com/9167728/1758022 实战 Part1:写在最前 我备份一般就三个参数 --s

Android 再谈handler

今天在做http网络事件的响应网络接收处理一般不能放在主线程中使用,目前也只会使用AsyncTask进行处理!之前虽然写过handler处理的一些文章但是发现全不会了!无奈~ 关于handler某位兄弟已经整理的很透彻了!现在引用下原话如下: Handler监听者框架:子线程是事件源,主线程是监听者.Handler作为子线程的监听器出现:主线程中生成Handler的子类,并重写handleMessage(Message msg) 方法,用来对子线程响应.子线程调用Hanlder的sendMess

再谈ORACLE CPROCD进程

罗列一下有关oprocd的知识点 oprocd是oracle在rac中引入用来fencing io的 在unix系统下,如果我们没有采用oracle之外的第三方集群软件,才会存在oprocd进程 在linux系统下,只有在10.2.0.4版本后,才会具有oprocd进程 在window下,不会存在oprocd 进程,但是会存在一个oraFenceService服务,用来实现相同的功能,该服务采用的技术是基于windows的,与oprocd不同 oprocd进程可以运行在两者模式下:fatal和n

浅谈委托和事件(一)

浅谈委托和事件(一) 关于委托和事件,可能是.NET或者说是面向对象编程语言中的一个比较重要又比较难以理解的概念.关于这一话题,园子里的人也写了很多文章,最经典的可能就是张子阳的C#中的委托和事件这两篇文章了,之前也看过MSDN 上的WebCast深入 "委托和事件".可能和很多人一样,刚开始读的时候,觉得很清楚,但是过了一段时间好像又忘记了委托和事件的区别,知道很久以前,在一次面试中我被问到委托和事件有什么区别,一下子就说不清了. 所以这里稍微理一下,也算是自己的一个总结.当然,还是

Java基础——再谈面向对象

去年的这个时候,心血来潮写了篇<简述面向对象技术>,先在看来不由的会想:这都是写的什么跟什么啊?(ps:虽然现在写的博客依然不咋地)但是,Java的学习中又一次不得不再一次面向对象,所以,奉上一篇<再谈面向对象>,做为新年的一盘开胃菜. 面向对象是相对于面向过程而言,是一种思想. 区别于面向过程: 面向过程是以函数为基础,完成各种操作,强调的是过程,而面向对象是以对象为基础,强调的是对象. 比如说把大象装进冰箱分为几步,宋丹丹是这样说的:三步呗, 第一步:打开冰箱门, 第二步:把大

再谈multistage text input(中文输入法)下UITextView的内容长度限制

之前写过一篇<如何更好地限制一个UITextField的输入长度>,在文章最后得到的结论是可以直接使用 UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotification; 进行监听,截断超出maxLength的部分. 所以后来我在处理UITextView的内容长度时,也直接参考这个方法: [[NSNotificationCenter defaultCenter] addObserver:self selector:@select

再谈javascript图片预加载技术

图片预加载技术的典型应用: 如lightbox方式展现照片,无疑需要提前获得大图的尺寸,这样才能居中定位,由于javascript无法获取img文件头数据,必须等待其加载完毕后才能获取真实的大小然后展示出来,所以lightbox显示的图片的速度体验要比直接输出的差很多,而本文说提到的预加载技术主要针对获取图片尺寸. 一段典型的使用预加载获取图片大小的例子: var imgLoad = function (url, callback) {    var img = new Image();