关于委托(2)

      前面使用的委托只包含一个方法调用。调用委托的次数与调用方法的次数相同。如果要调用多个方法,就需要多次显示调用这个委托。其实委托也可以包含多个方法,这种委托就是多播委托。如果调用多路委托,就可以按顺序连续调用多个方法。

      多播委托派生于System.MulticastDelegate,它的Combine方法允许把多个方法调用链接在一起,我们可以通过+和+=来向委托添加调用方法,也可以用-和-=删除其中的调用方法。如:

    class Program
    {
        private delegate void DoubleOP(double x);
        static void Main(string[] args)
        {       
            DoubleOP operations = MathsOpration.MutiplybyTwo;
            operations += MathsOpration.Square;
            ProcessAndDisplay(operations, 2.0);
            ProcessAndDisplay(operations, 7.9);
            ProcessAndDisplay(operations, 1.414);

            Console.ReadKey();
        }
        static void ProcessAndDisplay(DoubleOP action, double value)
        {
            Console.WriteLine();
            Console.WriteLine("ProcessAndDisplayNumber called with value={0}", value);
            action(value );
          
        }

    }
    class MathsOpration
    {
        public static void  MutiplybyTwo(double value)
        {
            double result = value * 2;
            Console.WriteLine ("Mutiplying by 2:{0} gives {1}",value ,result  );
        }
        public static void  Square(double value)
        {
            double result = value * value;
            Console.WriteLine("Squaring :{0} gives {1}",value,result );
        }
    }

 

结果截图:

 

注意:

      1、多播委托中委托的签名必须返回void;否则,就只能得到委托调用的最后一个方法的结果。

      2、如果使用多播委托,就应该注意同一个委托调用链的顺序并未正式定义,因此避免编写依赖于以特定顺序调用方法的代码;

      3、多播委托包含一个逐个调用的委托集合。如果通过委托调用的一个方法抛出了异常,整个迭代就会停止。

        解决方法:手动迭代方法列表

        源代码如下,大家有空可以去尝试下:

     

    //弹出异常,终止迭代的代码

    public delegate void DemoTrying();
    class Program
    {
        static void Main()
        {
            DemoTrying d = One;
            d += Two;
            try
            {
                d();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message );
            }
            Console.ReadKey();

        }
        static void One()
        {
            Console.WriteLine("one");
            throw new Exception("Error in one");
        }
        static void Two()
        {
            Console.WriteLine("two");
        }
    }  

 

 

    //更改之后的代码

    public delegate void DemoTrying();
    class Program
    {
        static void Main()
        {
            DemoTrying d = One;
            d += Two;
           
Delegate [] delegates=d.GetInvocationList ();
            foreach (DemoTrying d1 in delegates)
            {
                try
                {
                    d1();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }

            Console.ReadKey();

        }
        static void One()
        {
            Console.WriteLine("one");
            throw new Exception("Error in one");
        }
        static void Two()
        {
            Console.WriteLine("two");
        }
    }  

 

 

委托的知识是十分重要的,也是十分广泛的。在此提下委托涉及的其他知识,有意向的同学可以去看下:匿名方法,Lambda表达式,返回类型协变和参数类型抗变等等。其中匿名方法,Lambda表达式有助于简化委托的代码量(以人为本哦)

转载于:https://www.cnblogs.com/qlb5626267/archive/2009/04/27/1444718.html

【无线传感器】使用 MATLAB和 XBee连续监控温度传感器无线网络研究(Matlab代码实现)内容概要:本文围绕使用MATLAB和XBee技术实现温度传感器无线网络的连续监控展开研究,介绍了如何构建无线传感网络系统,并利用MATLAB进行数据采集、处理与可视化分析。系统通过XBee模块实现传感器节点间的无线通信,实时传输温度数据至主机,MATLAB负责接收并处理数据,实现对环境温度的动态监测。文中详细阐述了硬件连接、通信协议配置、数据解析及软件编程实现过程,并提供了完整的MATLAB代码示例,便于读者复现和应用。该方案具有良好的扩展性和实用性,适用于远程环境监测场景。; 适合人群:具备一定MATLAB编程基础和无线通信基础知识的高校学生、科研人员及工程技术人员,尤其适合从事物联网、传感器网络相关项目开发的初学者与中级开发者。; 使用场景及目标:①实现基于XBee的无线温度传感网络搭建;②掌握MATLAB与无线模块的数据通信方法;③完成实时数据采集、处理与可视化;④为环境监测、工业测控等实际应用场景提供技术参考。; 阅读建议:建议读者结合文中提供的MATLAB代码与硬件连接图进行实践操作,先从简单的点对点通信入手,逐步扩展到多节点网络,同时可进一步探索数据滤波、异常检测、远程报警等功能的集成。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值