您的位置:首页 > 编程语言 > C#

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: