.Net (C#)委托和事件(获取多个返回值)

From: http://www.xuebuyuan.com/841530.html


在讲如何获取多个返回值之前先来看一个小例子:

 

        private void button1_Click(object sender, EventArgs e)
        {
            int Number = 200;         //设置Number的值为 200。
            Publishser pub = new Publishser();     //实例化Publishser
            Subscriber1 sub1 = new Subscriber1();     //实例化Subscriber1
            Subscriber2 sub2 = new Subscriber2();     //实例化Subscriber2
            Subscriber3 sub3=new Subscriber3();       //实例化Subscriber3
            pub.NumberChanged += sub1.OnNumberChanged;   //将方法绑定到委托
            pub.NumberChanged += sub2.OnNumberChanged;
            pub.NumberChanged += sub3.OnNumberChanged;
            pub.DoComething(Number);      //调用DoComething
        }

    class Publishser
    {
        public delegate int DemoEventHandler(int num);      //定义委托,可代表的方法类型是整形
        public event DemoEventHandler NumberChanged;  //申明事件
        public void DoComething(int temp)
        {
            if (NumberChanged != null)
            {
                 temp=NumberChanged(temp);
            }
            MessageBox.Show(temp.ToString());
        }
    }

    class Subscriber1
    {
        public int OnNumberChanged(int num)
        {
            MessageBox.Show("调用了Subscriber1类,num值为:"+ num);
            return num + 100; ;
        }
    }

    class Subscriber2
    {
        public int OnNumberChanged(int num)
        {
            MessageBox.Show("调用了Subscriber2类 num值为:"+num);
            return num+100;
        }
    }

    class Subscriber3
    {
        public int OnNumberChanged(int num)
        {
            MessageBox.Show("调用了Subcriber3类,num值为:"+num);
            return num+100;
        }
    }

 

 

 

 我以为得到的结果是:

                              调用了Subscriber1类,num值为:200

                              调用了Subscriber2类,num值为:300

                              调用了Subscriber3类,num值为:400

                              500

但是程序运行完之后结果却不是我所想的,结果是:

                                                                    调用了Subscriber1类,num值为:200

                                                                    调用了Subscriber2类,num值为:200

                                                                    调用了Subscriber3类,num值为:200

                                                                    300

发现问题之后我用逐语句运行的方式调试程序,我发现当NumberChanged != null 第一次调用了Subscriber1之后并没有返回到Publishser类,也没有执行Subscriber1的 return,而是直接调用了Subscriber2,temp的值依旧是刚开始的200。执行完之后调用Subscriber3,只有当Subscriber3执行完了之后才返回到Publishser 这个时候temp的值等于300。(现在我也不知道为什么会这样,但是我在网上学习了一种可以获取多个返回值的方法!)

---------------------------------------------------------------------------------------------------------------------------------------

获取多个返回值:

 

        private void button1_Click(object sender, EventArgs e)
        {
            int Number = 200;
            Publishser pub = new Publishser();
            Subscriber1 sub1 = new Subscriber1();
            Subscriber2 sub2 = new Subscriber2();
            Subscriber3 sub3=new Subscriber3();
            pub.NumberChanged += sub1.OnNumberChanged;
            pub.NumberChanged += sub2.OnNumberChanged;
            pub.NumberChanged += sub3.OnNumberChanged;
            pub.DoComething(Number);
        }

    class Publishser
    {
        public delegate int DemoEventHandler(int num);
        public event DemoEventHandler NumberChanged;
        public void DoComething(int temp)
        {
            if (NumberChanged != null)
            {
                Delegate[] delArray = NumberChanged.GetInvocationList();  
                foreach (Delegate del in delArray)
                {
                    DemoEventHandler method = (DemoEventHandler)del;
                    temp = method(temp);
                }
            }
            MessageBox.Show(temp.ToString());
        }
    }

    class Subscriber1
    {
        public int OnNumberChanged(int num)
        {
            MessageBox.Show("调用了Subscriber1类,num值为:"+ num);
            return num + 100; ;
        }
    }

    class Subscriber2
    {
        public int OnNumberChanged(int num)
        {
            MessageBox.Show("调用了Subscriber2类 num值为:"+num);
            return num+100;
        }
    }

    class Subscriber3
    {
        public int OnNumberChanged(int num)
        {
            MessageBox.Show("调用了Subcriber3类,num值为:"+num);
            return num+100;
        }
    }

运行得到的结果是:

                              调用了Subscriber1类,num值为:200

                              调用了Subscriber2类,num值为:300

                              调用了Subscriber3类,num值为:400

                              500

 

现在就是我想到的结果了,利用Delegate 基类的GetInvocationList()静态方法,可以得到委托链表,随后遍历委托链表依次执行,就可以得到每个方法的返回值了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-dialog点击弹框外区域不关闭弹框;

el-dialog正常点击弹框外区域是关闭弹框,如若不想关闭弹框,设置如下属性即可: :close-on-click-modal"false"

Xen的起源与工作原理

如今,虚拟化市场上满是各种不同的虚拟化解决方案。多年以来,VMware一直控制着基于i386的虚拟化市场。然而,现在的开源解决方案Xen也 在迅速地扩张自己的市场。在本文中,TechTarget中国的特约虚拟化专家Sander van Vugt将介绍什么是…

男女完全匹配算法

#include<iostream> #include<String> #include"Free_W_M_Stack.cpp" using namespace std; int Number1(string elem, string A[], int n){//返回某个人的匹配号for (int i 0; i < n; i){if (elem A[i])return i;}return -1; } int main(){int n;/…

监听el-dialog关闭弹窗事件;el-dialog注册@close关闭事件

场景&#xff1a;在关闭el-dialog弹框时候&#xff0c;做数据清空。只需要给el-dialog注册close关闭事件即可&#xff1a; <el-dialog title"标题" :visible.sync"bind" size"small" closecloseDialog> </el-dialog>//关闭弹框的事件…

手机游戏赚钱到底有多难?接入运营商或需一年

假如你是一个手机游戏创业者&#xff0c;假如你想赚钱&#xff0c;亲&#xff0c;请先与运营商搞好关系&#xff0c;或者&#xff0c;请找一个有SP经验或者熟悉手机游戏审批流程的合作伙伴&#xff0c;否则&#xff0c;等待你的将是甚至长达一年的审批期。 先来讲讲我为何要写这…

总是骗人的你

从这周来&#xff0c;就一直在和周围的人说着要结束实习。到现在&#xff0c;也没有办法办理离职。我现在已经看不起自己了&#xff0c;我已经成为我当初讨厌的人&#xff0c;嘴里一直嚷嚷着&#xff0c;却一直都做不到。还不停的给周围的人说&#xff0c;我想&#xff0c;这种…

Controller向View传值方式总结

From: http://www.cnblogs.com/guohu/p/4377974.html 总结发现ASP.NET MVC中Controller向View传值的方式共有6种&#xff0c;分别是&#xff1a; ViewBagViewDataTempData向普通View页面传一个Model对象向强类型页面传传一个Model对象用一个ViewModel对象解决所有问题 首先我们…

el-table-column动态显示与隐藏

两个不同条件下共用一个el-table表格&#xff0c;并且通过v-if控制某一列的显示与否。 若不生效&#xff0c;则按照如下设置。 ​​​​​​​<el-table-column v-if"undo" label"xxxx" prop"xx" min-width"110" show-overflow-too…

重装系统后,快盘不能拷贝进文件的解决办法

给对应账号的的虚拟磁盘文件&#xff0c;添加"Authenticated Users"账户的权限

记录一次bug解决过程:数据迁移

一 总结不擅长语言表达&#xff0c;勤于沟通&#xff0c;多锻炼 调试MyBatis中SQL语法:foreach 问题&#xff1b;缺少关键字VALUES。很遗憾&#xff1a;它的错误报的让人找不着北。 二 BUG描述&#xff1a;MyBatis中批量插入数据异常 <?xml version"1.0" encodin…

el-tabs标签页浏览器卡死;使用el-tab-pane浏览器卡死;element-ui使用el-tab-pane浏览器卡死,el-tab,el-tab-pane版本不兼容

在项目中使用了el-tabs标签页卡死&#xff0c;一直刷新加载中 出现该问题的原因主要是版本不兼容的问题 首先找到package.json&#xff0c;将以下vue版本修改为2.6.0&#xff0c;element-ui版本修改为2.13.2&#xff1a; “element-ui”: “2.13.2” “vue”: “2.6.0” “vue-…

.net 获取网站根目录的方法

From: http://www.cnblogs.com/wenbo/archive/2011/08/09/2132620.html 获取网站根目录的方法有几种如&#xff1a; Server.MapPath(Request.ServerVariables["PATH_INFO"])    Server.MapPath("/")    Server.MapPath("")//当前代码文件所在…

2013年3月16日星期六

今天第11周&#xff0c;本来是双休&#xff0c;结果要加班&#xff0c;本来要加班写详细设计结果被做画面自适应解决现场问题。本来想回来一个人安静写详细设计&#xff0c;结果却一直在看电影聊天&#xff0c;似乎回来后就不能控制自己了&#xff0c;有点痛苦

繁华模拟赛 ljw分雕塑

/* 用f[i][k]表示考虑到第i个雕塑&#xff0c;分成k组&#xff0c;可不可行&#xff08;这是一个bool类型的数组&#xff09; 转移&#xff1a; f[i][k]f[j][k-1],sum[i]-sum[j]合法 */ #include <cstdio> #include <cstdlib> #include <cstring> #include &…

el-table滚动加载数据;vue自定义指令监听el-table的滚动事件,达到滚动条滚动到底部加载新数据

首先在vue项目中的main.js文件添加一个监听el-table滚动条事件的自定义指令&#xff0c;以供全局使用 // 监听el-table滚动 Vue.directive(loadmore, {bind(el, binding) {const selectWrap el.querySelector(.el-table__body-wrapper)selectWrap.addEventListener(scroll, fu…

PHPMailer - PHP email transport class

在服务器安装 sendmail sudo apt-get install sendmail启动 sendmailsudo /etc/init.d/sendmail start 修改 php.ini [mail function] SMTP localhost smtp_port 25 sendmail_from meexample.com Function sendMail <?php /* 调用PHPMailer发送电邮 * param String $r…

Razor语法大全

From: http://www.cnblogs.com/dengxinglin/p/3352078.html Razor是基于framewor4以上写的一个开源项目&#xff1a;https://github.com/Antaris/RazorEngine/ Razor是包含了模板引擎和动态编译两部分。本部分就简单记录了模板引擎的一些语法&#xff0c;之后用Razor做一个代码…

ArcGIS Engine开发之旅02--ArcGIS Engine中的类库

原文 ArcGIS Engine开发之旅02--ArcGIS Engine中的类库 System类库 System类库是ArcGIS体系结构中最底层的类库。System类库包含给构成ArcGIS的其他类库提供服务的组件。System类库中定义了大量开发者可以实现的接口。AoInitializer对象就是在System类库中定义的&#xff0c;所…

el-dialog的内容不刷新;el-dialog内容有缓存;el-dialog里面的组件不刷新问题;

el-dialog里面的内容是带缓存的&#xff0c;也就是说除了第一次打开会初始化&#xff0c;其他次打开都是直接加载缓存的&#xff1b; 这就导致了有时候打开弹框时候&#xff0c;内容不刷新。有说法说是el-dialog嵌套太深大致的。 解决方法&#xff1a;直接给弹框的内容部分添加…

Android布局属性详解之RelativeLayout

RelativeLayout用到的一些重要的属性&#xff1a; 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:layout_centerInparent 相对于父元素完全居中 android:layout_alignParentBottom 贴紧父元素的下边…