C#核心技术---委托(Delegate)

目录

委托的定义与特点

委托声明与实例化

多播委托


 

委托的定义与特点

C# 中的委托(Delegate)类似于 C 或 C++ 中的函数指针,是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用

委托经常适用于实现事件和回调方法,所有的委托都派生自 System.Delegate 类。

在实例化委托时,可以将委托的实例与具有相同参数列表与返回值类型的方法相关联,然后就可以通过委托实例来调用方法。

使用委托还可以将方法作为参数传递给其他方法。

委托具有以下特点:

  • 委托是完全面向对象的,委托是同时封装对象实例和方法;
  • 委托允许将方法作为参数进行传递;
  • 委托可用于定义回调方法;
  • 委托可以将多个方法链接在一起;
  • 方法不必与委托类型完全匹配;
  • C# 2.0 版引入了匿名函数的概念,可以将代码块作为参数(而不是单独定义的方法)进行传递。C# 3.0 引入了 Lambda 表达式,利用它们可以更简练地编写内联代码块。匿名方法和 Lambda 表达式都可编译为委托类型,这些功能现在统称为匿名函数。

委托声明与实例化

声明委托需要使用 delegate 关键字,语法如下:

delegate  返回值类型 委托名 (参数列表....)
    delegate int Calculate(int a,int b);
delegate void ShowMsg(string msg);

委托可以引用与委托具有相同签名的方法,也就是说委托在声明时即确定了委托可以引用的方法

相同签名:方法的返回值类型、参数类型、参数个数、参数顺序 都完全相同,并不是方法名与委托名相同

实例化

1.委托声明后,可用new关键字来实例化,即创建委托对象,将其与特定的方法关联。

delegate int Calculate(int a,int b);//声明一个计算的委托
//提供两个与之对应的方法
public int Add(int a,int b)
{
   return a+b;
}
public int Subtract(int a,int b)
{
   return a-b;
}
public void Test()
{
   //实例化委托
  Calculate add=new Calculate(Add);//创建委托对象,并与Add方法关联
  Calculate subtract=new Calculate(Subtract);//创建委托对象,并与Subtract方法关联
  //委托调用
  int sum= add(10,20);  // 30
  int dValue=subtract(20,5); // 15
}

2.委托还可以通过将方法签名赋给委托变量。

Calculate add1=Add;
int sum1=add1(30,5); //35

多播委托

委托对象可使用 "+=" 运算符合并多个委托。只有相同类型的委托可被合并。使用"-=" 运算符可用于从合并的委托中移除委托。

使用委托的这个特点,可以创建一个委托被调用时要调用的方法列表,这被称为委托的多播(multicasting)。

多播委托应用于:一个动作触发一连串的的操作。

delegate void ShowMsg(string msg);//声明一个显示信息的委托
//提供对应类型的方法
public void WriteMsg(string msg)
{
   Console.WriteLine("显示的消息内容:"+msg);
}

public void PrintMsg(string msg)
{
   Console.Write("输出的消息:"+msg+"\n");
}

public void Test()
{
   ShowMsg print1 = WriteMsg;
   print1 += PrintMsg; 
   print1("欢迎来到朝夕教育课堂!");
}
//输出  ---先执行WriteMsg方法,再执行PrintMsg
显示的消息内容:欢迎来到朝夕教育课堂!
输出的消息:欢迎来到朝夕教育课堂!

如果多播委托调用的一系列方法都是有返回值,只会得到最后一个方法的执行结果。

delegate double Calculate(double d1,double d2);//声明一个计算的委托
//提供对应类型的方法
public double Add(double a,double b)
{
   return a+b;
}

public double Multiply(double a,double b)
{
   return a*b;
}

public double Divide(double a,double b)
{
   return a/b;
}

public void Test()
{
   Calculate cal = Add;
   cal += Multiply; 
   cal += Divide;
   double result =cal(6.2,3.1);  //2  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值