首页 > 编程语言 >C#事件获取返回值

C#事件获取返回值

时间:2022-11-24 09:22:46浏览次数:33  
标签:调用 获取 C# 值为 int num Subscriber1 NumberChanged 返回值

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()静态方法,可以得到委托链表,随后遍历委托链表依次执行,就可以得到每个方法的返回值了。

 

 

出处:https://dandelioncloud.cn/article/details/1536139037803134978

标签:调用,获取,C#,值为,int,num,Subscriber1,NumberChanged,返回值
From: https://www.cnblogs.com/mq0036/p/16920788.html

相关文章

  • [VS Code] Cannot read keys when either application does not have a console or wh
    在VSCode运行C#Console程序报错。 原因:  解决方案:1.打开launch.json.  2.修改  "console":"internalConsole" --> "console":"integra......
  • CF1452D Radio Towers 题解
    可能更好的阅读体验题目传送门题目大意在数轴上有\(n+2\)个小镇,位置为\(0,1,\dots,n,n+1\)。现在在\(1,2,\dots,n\)的小镇都有\(\dfrac{1}{2}\)的概率建设一个......
  • VUE3 自定义 轻量级全局数据共享方案之一 Provide&inject (简单快速实现vuex功能)
    在vue2中,提供了provide和inject配置,可以让开发者在高层组件中注入数据,然后在后代组件中使用除了兼容vue2的配置式注入,vue3在compositionapi中添加了provide和inject方法......
  • codeforce E - Binary Inversions题解
    题目:给你一个01串,现在你可以(或者不用)选取其中一个元素进行一次反转操作0-1,1-0;从而使得串中的逆序对个数最多。题目链接:codeforceoriginproblem思路:1.如何统计逆序对......
  • CCNP Day3 EIGRP的相关概念
    1、Eigrp参数R2#showipeigrpneighborsIP-EIGRPneighborsforprocess100HAddressInterfaceHoldUptimeSRTTRTOQSeq......
  • SpringSecurity-从入门到精通-三更草堂
    SpringSecurity从入门到精通课程介绍0.简介​ SpringSecurity是Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比......
  • sqlservice 简单语法
    --支持sqlservice createdatabase(库名)gouse (库名)createtable表(id int,--字段属性namenvarchar(max))--修改表添加字段属性altertable【表名】......
  • gcc/g++ 编译器入门(1)
    GCC全称是GNUCompiler Collection 意思是gnu编译器合集也就是说GCC包括了各种语言的编译器比如c编译器c++编译器 java编译器Fortran编译器go编译器等等我们这......
  • MFC对话框之间传递数据
     方法一:全局变量法  方法二:主对话框法:AfxGetMainWnd()   方法三:父窗口法:GetParent()   方法四:成员变量、成员函数法     ......
  • WebSocket
    1、WebSocket基于TCP协议,支持二进制通信,双工通信。2、性能和并发能力更强。3、WebSocket独立于HTTP协议,不过我们一般仍然把WebSocket服务器端部署到Web服务器上,因为可以......