委托与事件

原创 2007年10月01日 13:09:00

委托:譬如别人委托你买你去书挑选一本好的c#的书,而你却因为懒得动,直接去了dearbook选书,然后送上门。然后你转交给了朋友。这就是现实中的委托。-------你的好朋友并不知道,你没有去书店选。(不关注方法的细节)
c#中把委托的作用当作是给方法的签名(包括参数类型,个数,方法的返回类型)指定名称。委托代表了方法。
为什么说委托的类型是安全的:因为在定义委托的时候就指定了它所调用的方法的签名,所以在构造委托实例的时候会判断是否正确。

 
 2using System;
 3
 4namespace test1
 5{
 6 /// <summary>
 7 /// Class1 的摘要说明。
 8 /// </summary>

 9 
10 class MathsOperations
11 {
12  public static double multiplyByTwo(double value)
13  {
14   return value*2;
15  }

16
17  public static double Square(double value)
18  {
19   return value*value;
20  }

21 }

22
23 delegate double DoubleOp(double x);
24
25 class test1
26 {
27  static void Main()
28  {
29   DoubleOp[] operations =
30    {
31     new DoubleOp(MathsOperations.multiplyByTwo),
32     new DoubleOp(MathsOperations.Square)
33    }
;
34
35   for(int i=0;i<operations.Length;i++)
36   {
37    Console.WriteLine("Using operations[{0}];",i);
38    ProcessAndDisplayNumber(operations[i],2.0);
39    ProcessAndDisplayNumber(operations[i],5);
40    Console.WriteLine();
41   }

42  }

43
44  static void ProcessAndDisplayNumber(DoubleOp action,double value)
45  {
46   double result = action(value);
47   Console.WriteLine("Value is {0},result of operation is {1}",value,result);
48  }

49 }

50 
51
52}

53
有些时候不用委托是很难实现某些功能的
 1    class BubbleSorter
 2    {
 3        static public void Sort(object[] sortArray,CompareOp gtMethod)
 4        {
 5            for(int i=0;i<sortArray.Length;i++)
 6            {
 7                for(int j=i+i;i<sortArray.Length;j++)
 8                {
 9                    if(gtMethod(sortArray[j],sortArray[i]))
10                    {
11                        object temp = sortArray[i];
12                        sortArray[i] = sortArray[j];
13                        sortArray[j] = temp;
14                    }

15                }

16            }

17        }

18    }

19
20    delegate bool CompareOp(object lhs,object rhs);
21
22    class Employee
23    {
24        private string name;
25        private decimal salary;
26
27        public Employee(string name,decimal salary)
28        {
29            this.name=name;
30            this.salary=salary;
31        }

32        public override string ToString()
33        {
34            return string.Format(name + ",{0:c}",salary);
35        }

36        public static bool RhslsGreater(object lhs,object rhs)
37        {
38            Employee empLhs = (Employee)lhs;
39            Employee empRhs = (Employee)rhs;
40            return(empLhs.salary>empRhs.salary)?true:false;
41        }

42    }

43
44
45    class test1
46    {
47        static void Main()
48        {
49            Employee [] employees = 
50            {
51                new Employee("abc",100),
52                new Employee("bbc",122),
53                new Employee("bb",111),
54            }
;
55
56
57            CompareOp employeeCompareOp = new CompareOp(Employee.RhslsGreater);
58            BubbleSorter.Sort(employees,employeeCompareOp);
59
60            for(int i=0;i<employees.Length;i++)
61            {
62                Console.WriteLine(employees[i].ToString());
63            }

64        }

65    }

66}
多播委托:委托包含多个方法。按顺序连续调用多个方法,委托的签名必须返回void(否则,返回值应送到何处)。实际上,如果编译器发现某个委托返回void,就会自动假定这是一个多播委托
例子:
 1using System;
 2
 3namespace test1
 4{
 5    /// <summary>
 6    /// Class1 的摘要说明。
 7    ///</summary>

 8    
 9        class MathsOperations
10        {
11            public static void multiplyByTwo(double value)
12            {
13                double result = value*2;
14                Console.WriteLine(
15                    "Multiplying by 2:{0} gives {1}",value,result);
16            }

17    
18            public static void Square(double value)
19            {
20                double result = value*value;
21                Console.WriteLine(
22                    "Squareing:{0} gives {1}",value,result);
23            }
    
24        }

25    
26        delegate void DoubleOp(double value);
27    
28        class test1
29        {
30            static void Main()
31            {
32                 //或,委托可以识别 +,+=,-,-=
33                //DoubleOp operations = new DoubleOp(MathsOperations.multiplyByTwo);
34                //operations += new DoubleOp(MathsOperations.Square);
35
36                DoubleOp opertaion1 = new DoubleOp(MathsOperations.multiplyByTwo);
37                DoubleOp operation2 = new DoubleOp(MathsOperations.Square);
38                DoubleOp operations = opertaion1 + operation2;
39
40                ProcessAndDisplayNumber(operations,2.0);
41                ProcessAndDisplayNumber(operations,40.0);
42            }

43    
44            static void ProcessAndDisplayNumber(DoubleOp action,double value)
45            {
46                Console.WriteLine("/nProcessAndDisplay Number called with value = " +
47                    value);
48                action(value);
49            }

50        }

51}

事件:事件与委托是密不可分的。
应用程序是通过windows来通信的,而windows又是使用预定义的消息与应用程序通信的。微软已经定义好了N多个系统事件(消息),譬如点击一个摁钮,打开一个下拉框,等等。事件接收器就是指发生某事件时被通知的任何应用程序,对象或组件。事件发送器可以是应用程序的一个对象或程序集。系统事件中如鼠标单击,键盘按键。.net程序中的事件发送器就是.net的运行库,.net framework把windows消息封装在了事件中,偶没学过windows编程,对windows消息的机制不甚了解。大概就是button的click事件封装了windows的WM_MOUSECLICK消息。然后就可以直接调用click事件了。
button1.click  += new EventHandler(Button_Click);
事件              +=    实例化一个委托(某个方法)   //可多个方法依次添加到委托列表,但不能保证调用时方法的顺序。
EventHandler 委托在Farmework是已定义的,位于System命名空间,在所有的Farmework中的定义的事件都是用它。添加到该委托列表的方法都必须有相同的签名。private void Button_Click(object sender , Eventargs e) //1参:引发事件的对象,2参:包含有关事件的其他有用信息的对象,可任意类型,只要派生于它均可,譬如MouseDownEventArgs 类型。
 

事件与委托趣谈

 事件与委托似乎很难以理解,这是因为它们的使用方式与常用的编码有很大的差别,例如通常编写的都是同步代码,调用一个类型的方法,会即刻出现方法执行的结果,这是符合逻辑的。但在某些情况中,同步代码未必满足需...
  • chiangbt
  • chiangbt
  • 2008年01月17日 21:51
  • 26590

委托和事件的区别(讲的很详细)

原文地址:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx 委托 和 事件在 .Net F...
  • chopper7278
  • chopper7278
  • 2008年10月25日 23:58
  • 12407

观察者设计模式 Vs 事件委托(java)

观察者设计模式 Vs 事件委托标签: 设计模式 java 事件的委托本篇博客主要讲解一下几个问题 什么是观察者模式 观察者模式的优缺点 如何看待观察者模式的缺点 事件的委托 什么是观察...
  • gdutxiaoxu
  • gdutxiaoxu
  • 2016年07月05日 00:03
  • 6157

Unity中对于委托、事件的应用

[引言] 这边文章主要是针对刚踏入这行的程序员,是我工作半年多来积累下来的一些经验,仅作为参考,也希望各位经验丰富的前辈多批评指正。 我是专科生毕业,我们学校所教的C#的内容其实只有非常非常基础的那些...
  • GhostOrange
  • GhostOrange
  • 2016年11月13日 18:01
  • 2378

快速理解C#中的委托与事件

以下内容只是个人理解,仅供参考。 什么是委托? 先看最简单的委托例子: namespace DelegateTest { public delegate void MessageDele...
  • Wiiix
  • Wiiix
  • 2016年05月20日 20:02
  • 5633

C# .Net 委托和事件的区别

   在.net中,事件是一种特殊的委托,那他到底特殊在哪,换句话说,加上event关键字到底有什么用,我理解主要有两方面,下面用实例说明:    一 、事件只能在本类型内部“触发”,委托不管在本类型...
  • azkaser
  • azkaser
  • 2009年11月24日 15:18
  • 8886

CSharp学习笔记之十一 委托与事件

对C#的委托和事件,其实想写点东西,但是偶然间翻到一篇文章,感觉挺好的,所以就直接转过来吧。其实好的东西都是要用来分享的么,不管是不是我自己的,但是学会了,就是我自己的。学习么就是这样的,这篇博文不算...
  • caosiyuan1991
  • caosiyuan1991
  • 2013年12月27日 16:26
  • 4443

C# 中的委托和事件(详解)

C# 中的委托和事件        委托和事件在 .NET Framework 中的应用非常广泛,然而,较好地理解委托和事件对很多接触 C# 时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛...
  • ZXD9790902
  • ZXD9790902
  • 2016年09月29日 09:10
  • 378

黑马程序员---委托与事件的区别与联系

委托和事件的区别: 事件是一个私有的委托变量,加上两个方法:add和remove方法,在外界通过+=和-=进行赋值操作 事件机制可以避免在其他无关方法中...
  • zhangsu_
  • zhangsu_
  • 2014年04月01日 17:55
  • 725

WinForm中C#委托和事件的使用(回顾)

闲了很长时间了,最近想把以前的基础东西回顾一下,先从委托开始。使用委托一般是在有需要的时候,如 一个窗体想直接调用另外一个窗体的方法,这时候用委托是很方便的。如果有必要的话,可以写一个专门的类,定义委...
  • ahshow
  • ahshow
  • 2007年12月13日 11:30
  • 5038
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: 委托与事件
举报原因:
原因补充:

(最多只允许输入30个字)