C#高级编程9-第8章 委托、lamdba表达式和事件
2017-05-11 13:32
253 查看
委托、lamdba表达式和事件
1.引用方法
函数指针是一个指向内存位置的指针,不是类型安全的。无法判断实际指向。参数和返回类型也无从知晓。.NET委托是类型安全的。定义了返回类型和参数类型,不仅包含方法引用,还可以包含多个方法引用。
2.委托
使用方法作为参数进行传递,必须把方法细节进行封装到一个新类型的对象中,即委托。委托是一种特殊类型的对象。我们之前定义的对象都包含数据。而委托包含的是多个方法的地址。
声明委托
委托使用delegate声明。通过指定返回类型、签名以及参数类型进行创建。创建委托的一个或多个实例,编译器将在后台创建表示该委托的一个类。
delegate void InitMethodInvoker(int x);
该委托方法无返回值,参数类型是int,每个实例都会有这个方法的引用。该委托类似于方法的定义,没有方法体。
委托可以使用访问修饰符进行修饰:
private delegate void InitMethodInvoker(int x);
定义委托后,创建它的实例,从而实现它的细节即方法体。
使用委托
class MathOperations { public static double MultiplayByTwo(double value) { return value * 2; } public static double Square(double value) { return value * value; } } //这个类中定义了委托的实例
public delegate double DoubleOp(double x);//声明委托 static void Main(string[] args) { DoubleOp[] operations = { MathOperations.MultiplayByTwo,//指定委托实例方法 MathOperations.Square }; for (int i = 0; i < operations.Length; i++) { //将委托实例方法作为参数传递 ProcessAndDisplayNumber(operations[i], 2.0);//operations[i]是委托即方法参数 ProcessAndDisplayNumber(operations[i], 15); } } static void ProcessAndDisplayNumber(DoubleOp action,double value) { double result = action( value);//实现委托 Console.WriteLine("参数值value:" + value + ",结果值result:" + result); }
通常情况下需要做安全措施。如果这个方法使用DoubleOp委托实例方法作为参数传递,如果传入null值,到了action( value)会出现异常。因此需要在方法里面加上判断
ProcessAndDisplayNumber(null, 15);
static void ProcessAndDisplayNumber(DoubleOp action,double value) { if(action!=null) double result = action( value);//实现委托 Console.WriteLine("参数值value:" + value + ",结果值result:" + result); }
系统委托
系统委托有4中:Action类、Func类、Predicate<T>、Comparison<T>委托
Action类的委托
Action委托 封装一个方法,该方法不具有参数并且不返回值
Action<T>委托 封装一个方法,该方法只有一个参数并且不返回值
Action<T1,T2>委托 封装一个方法,该方法具有两个参数并且不返回值
/* 1)WeakCarInfoEventManager.AddListener 2)WeakCarInfoEventManager.StartListening(object source) 3)dealer.NewCar("Mercedes"); 4)NewCarInfo(this, new CarInfoEventArgs(car)) 5)WeakCarInfoEventManager.CarDealer_NewCarInfo(object sender, CarInfoEventArgs e) 6)Consumer.ReceiveWeakEvent 7)Consumer.NewCarIsHere 8)WeakCarInfoEventManager.CarDealer_NewCarInfo执行完成 */
运行过程
@author duanlaibao
@help C# Advanced programming.Nine
@date 13:31:36
相关文章推荐
- 委托 事件 lambda表达式
- 【转】【UNITY3D 游戏开发之七】C# 中的委托、事件、匿名函数、Lambda 表达式
- C# 委托、事件,lamda表达式
- 委托、事件和Lmbdas表达式1----委托
- 浅谈委托、委托与事件、委托进化成lambda表达式和Linq
- C# Note2:委托(delegate) & Lambda表达式 & 事件(event)
- 委托, 匿名委托, Lambda表达式, 事件的本质, 以及Observer模式.
- c#Lamdba表达式与委托
- 委托,事件,回调,匿名函数与Lambda表达式详解
- 委托 事件 lamda表达式
- 学习笔记---对委托、匿名方法、Lama表达式及事件的理解
- 静态函数 抽象类 覆盖-重写-重载 委托-事件-匿名函数 密封 Lambda表达式
- 委托、事件和Lmbdas表达式2-事件
- 理解什么是委托、事件、Lambad表达式,从回调说起!
- 委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性
- 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别
- 【转】【UNITY3D 游戏开发之七】C# 中的委托、事件、匿名函数、Lambda 表达式
- 委托、 Lambda表达式和事件——委托
- 委托、事件和Lmbdas表达式3----委托相关知识
- C#基础加强篇---委托、Lamada表达式和事件(中)