• C# 委托和事件


    C# 委托和事件

    委托

    当要把方法传送给其他方法时,需要使用委托。首先定义要使用的委托,对于委托,定义它就是告诉编译器这种类型的委托代表了哪种类型的方法,然后创建该委托的一个或多个实例。编译器在后台将创建表示该委托的一个类。其语法类似于方法的定义,但没有方法体,定义的前面要加上关键字 delegate。因为定义委托基本上是定义一个新类,所以可以在定义类的任何地方定义委托,既可以在另一个类的内部定义,也可以在任何类的外部定义,还可以在命名空间中把委托定义为顶层对象。

    • 定义委托的语法如下
      delegate void IntMMethodInvoker(int x);

    • 假定要定义一个委托 TwoLongsOp,该委托代表的方法有两个 long 型参数,返回类型为 double。可以编写如下代码:
      delegate double TwoLongsOp(long first, long second);

    • 定义一个委托,它代表的方法不带参数,返回一个 string 型的值,则可以编写如下代码:
      delegate string GetAString();

    • 根据定义的可见性,可以在委托定义上添加一般的访问修饰符:public、private、protected 等:
      public delegate string GetAString();

    • 简单的委托示例

    class MathsOperations
    {
    	public static double MultiplyByTwo(double value)
    	{
    		return value * 2;
    	}
    	public static double Square(double value)
    	{
    		return value*value;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    下面调用这些方法:

    using System;
    namespace Wrox.ProCSharp.Delegates
    {
    	delegate double DoubleOp(double x);
    	class Program
    	{
    		static void Main()
    		{
    			DoubleOp[] operations = {
    				MathsOperations.MultiplyByTwo,
    				MathsOperations.Square,
    			};
    			
    			for (int i=0; i<operations.Length; i++)
    			{
    				Console.WriteLine("Using operations[{0}]:", i);
    				ProcessAndDisplayNumber(operations[i], 2.0);
    				ProcessAndDisplayNumber(operations[i], 7.94);
    				ProcessAndDisplayNumber(operations[i], 1.414);
    				Console.WriteLine();
    			}
    		}
    		static void ProcessAndDisplayNumber(DoubleOp action, double value)
    		{
    			double result = action(value);
    			Console.WriteLine("Value is {0}, result of operation is {1}", value, result);
    		}
    
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 多播委托
    delegate void DoubleOp(double value); // 定义委托
    DoubleOp opt1 = MathOperations.MultiplyByTwo;	// 委托1
    DoubleOp opt2 = MathOperations.Square;	// 委托2
    DoubleOp operations = operation1 + operation2;	// 委托增加
    
    operations(2.0); // 委托1,委托2的方法都会调用
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    多播委托还识别运算符-和-=,以从委托中删除方法调用。

    匿名方法

    用匿名方法定义委托的语法与前面的定义并没有区别。但在实例化委托时,就有区别了。下面是
    一个非常简单的控制台应用程序,说明了如何使用匿名方法:

    using System;
    namespace Wrox.ProCSharp.Delegates
    {
    	class Program
    	{
    		delegate string DelegateTest(string val);
    		static void Main()
    		{
    			string mid = ", middle part,";
    			DelegateTest anonDel = delegate(string param) // 匿名方法
    			{
    				param += mid;
    				param += " and this was added to the string.";
    				return param;
    			};
    			Console.WriteLine(anonDel("Start of string"));
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    事件

    基于 Windows 的应用程序也是基于消息的。这说明,应用程序是通过 Windows 来通信的,Windows又是使用预定义的消息与应用程序通信的。这些消息是包含各种信息的结构,应用程序和 Windows使用这些信息决定下一步的操作。在 MFC 等库或 Visual Basic 等开发环境推出之前,开发人员必须处理 Windows 发送给应用程序的消息。Visual Basic 和今天的.NET 把这些传送来的消息封装在事件中。如果需要响应某个消息,就应处理对应的事件。一个常见的例子是用户单击了窗体中的按钮后,Windows 就会给按钮消息处理程序(有时称为 Windows 过程或 WndProc)发送一个 WM_MOUSECLICK消息。对于.NET 开发人员来说,这就是按钮的 Click 事件。

  • 相关阅读:
    基于Apache组件,分析对象池原理
    RocketMQ 消费者消息回发 解析——图解、源码级解析
    IT信息技术-1.1 信息系统与信息化
    django创建应用程序后在项目中注册
    SpringSecurity系列——持久认证(Persisting Authentication),会话管理day3-2(源于官网5.7.2版本)
    JDK配置
    【思考总结】正项级数可以条件收敛吗?【负项级数?任意项级数?】
    非零基础自学Java (老师:韩顺平) 第6章 数组、排序和查找 6.14 二维数组的应用案例 && 6.15 二维数组使用细节和注意事项
    MySQL事务隔离级别详解
    【wpf】自定义事件总结(Action, EventHandler)
  • 原文地址:https://blog.csdn.net/u013420428/article/details/133354679