多播委托(from www.sysoft.cc)

一个委托类型实列不仅可以绑定一个方法,其实可以实现多个方法的绑定,即多播委托,或委托链。
如下:

namespace 多播委托

{//定义具有反回值无参数的委托类型变量

public delegate int weito();

class Program

{

static void Main(string[] args)

{//建立对应委托类型实列,并指定方法,通过增加方式,实现委托多播。

//委托执行一般按照增加方法的顺序进行。

weito kk = new weito(M1);

kk += M2;

kk += M3;

kk += M4;

Console.WriteLine(kk());//具有反回值的多播委托,最终只能返回最后添加方法的返回值。

Console.WriteLine("------------------遍历取得多播委托方法反回值-----------------");

Delegate[] delkks = kk.GetInvocationList();

//可能通过遍历,调用委托中每个方法,实现分步获取委托中的返回值。

//可以通过.GetInvocationList()方式获得当前委托中存储的所有方法。

//其反回值类型是一个Delegate[]数组(委托数组)

//其所有反回的委托均继承自抽像类MultiCastdelegate,而MultiCastdelegage又继承自抽像类Delegate。

//多播委托内部是将绑定在委托内部的多个方法,强制转换成了一个委托对象,并且将其存储在了一个叫_invocationList的object数组中。

//当调用委托时,遍历object数组,执行相对应的函数。

foreach (Delegate itemdelegate in delkks)

{

weito method = (weito)itemdelegate;

int k = method();

Console.WriteLine(k);

}

Console.ReadKey();

}

static int M1()

{

return 1;

}

static int M2()

{

return 2;

}

static int M3()

{

return 3;

}

static int M4()

{

return 4;

}

}

}

注意:1、当多播委托绑定的方法有出现异常时,则此方法以后的方法不再执行。
            2、委托进行方法增加或去除绑定只能用‘+=’或‘-=‘,如果直接使用‘=’则会将该委托变量绑定的所有方法覆盖掉。
           3、多播委托绑定的第一个方法只能用‘+=‘。
           4、委托同string一样,具有不可变的特性。
多播委托内存分配原理图(delegate k=new delegate(M1);k+=k2;)

时间: 2024-10-12 02:41:13

多播委托(from www.sysoft.cc)的相关文章

Net中委托之二多播委托

本篇主要讲解多播委托 1.多播委托的实例 public class MyDelegate { private delegate int NoParameterWithReturn();//1.声明委托 public static void Show() { NoParameterWithReturn method = new NoParameterWithReturn(ShowSomething);//2.委托的实例化 //多播委托 method += ShowSomething;//按顺序添加

委托和多播委托

刚刚学习了委托的内容,先来说一下自己对委托的理解,权当是复习吧: 委托可以定义在类里面,也可以定义在类外面,如果定义在类里面就只能被这个类调用,不论声明它是public 还是private.如果定义在类外面就能被所有类调用.如果程序是多线程的,委托方法希望能在UI层调用,那么可以在命名空间下定义. //委托的声明 delegate关键字,这个委托只能代表返回值是空.参数是一个string类型的一个方法public delegate void GreetingDelegate(string nam

C#多播委托

概述 在上一篇文章中,笔者就个人理解的委托做了简单的分享,本篇文章主要来说说多播委托.多播委托即每个委托可以包含多个方法. 理解多播委托 多播委托可以保护多个方法,但是在使用的时候需要注意:委托的签名必须是返回void,否则只能调用最后一个方法的得到结果.多播委托派生自System.MulticastDelegate类,System.MulticastDelegate类又派生自System.Delegate.System.MulticastDelegate的其他成员可以允许把多个方法调用链接为一

委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托

在"委托.Lambda表达式.事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性"中,反编译委托,发现委托都是多播委托. 既然委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链, 它是怎样形成的?来看下面的例子: namespace ConsoleApplication3 { internal delegate void MySayDel(string msg); class Program { stati

多播委托和匿名方法再加上Lambda表达式

多播委托就是好几个方法全都委托给一个委托变量 代码: 1 namespace 委托 2 { 3 class Program 4 { 5 static void math1() 6 { 7 Console.WriteLine("这是第一个方法"); 8 } 9 10 static void math2() 11 { 12 Console.WriteLine("这是第二个方法"); 13 } 14 15 static void Main(string[] args) 1

从多播委托到事件

一.多播委托 前文提到的委托只是在一个委托类型中存储了一个方法(函数),实际上一个委托变量可以同时绑定多个方法,这些委托形成了一个委托链,每一个委托(实际上是方法)都顺序指向下一个委托,这个委托链就是多播委托. 每一个绑定的方法就像是订阅者一样,等着发布者的消息,而触发委托变量的那个就像是发布者,将出发的信号传给所有的订阅者. 1.订阅者 考虑一个温度控制器的例子,这个控制器拥有两个调温器,一个加热器,当温度低于指定的值时,启动,一个冷却器,当温度高于指定的温度时,启动.二者的类设计如下: 1

委托三------------多播委托与匿名方法

============================================多播委托 -------------------------------------主程序 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication3 {     class Pr

多播委托

首先定义两个委托和几个方法,后面会用到. 委托: 1 public delegate void M1Delegate(); 2 3 public delegate int M2Delegate(int x,int y); 方法: 1 static int A1(int x,int y) 2 { 3 return x + y; 4 } 5 6 static int A2(int x, int y) 7 { 8 return x + y; 9 } 10 11 static int A3(int x,

【C#进阶】多播委托和委托数组像是一回事~

这个MathOperation类有三静态方法,参数都是double,并且没有返回值,考虑用Action<>() 这种预定义的委托哦 class MathOperations { public static void MultiplyByTwo(double value) { Console.WriteLine( "2* {0} = {1}",value,value * 2); } public static void Square(double value) { Conso