在学习别人的一个事件的例子中忽然想到了这个问题,我们在做Winform或者Webform时经常写一些事件处理函数,比如button的Click时间,往往这些处理函数并没有返回值(void),但是程序如何返回哪?图形界面的可能还不好解释,请看下面的两个程序代码:(就是自己定义了个事件,事件委托,和两个事件处理程序)别人的代码:
using System;namespace EventExample{
    class MainClass    {
       static void Main(string[] args)       {           EventPublisher publisher = new EventPublisher();
           EventReader1 reader1 = new EventReader1(publisher);
           EventReader2 reader2 = new EventReader2(publisher);
           publisher.DoSomthing();
           Console.WriteLine("This program already finished!");
           Console.ReadLine();       }    }     
  
   public class EventPublisher   // EventPublisher : 事件的发布者。
    {       // 第一步是申明委托
       public delegate int sampleEventDelegate(string messageInfo);
       // 第二步是申明与上述委托相关的事件
       public event sampleEventDelegate sampleEvent;
       public EventPublisher()       {       }       public void DoSomthing()      // 激发事件       {   
       
         if(this.sampleEvent != null)           {              this.sampleEvent("hello world!");           }                  }    }   
    public class EventReader1       // EventReader1 : 事件的订阅者1。
    {       public EventReader1(EventPublisher publisher)       {           publisher.sampleEvent +=new EventExample.EventPublisher.sampleEventDelegate(ResponseEvent);       }       private int ResponseEvent(string msg)       {           Console.WriteLine(msg + " --- This is from reader1");           return 0;       }    }
  
    public class EventReader2    {       public EventReader2(EventPublisher publisher)       {           publisher.sampleEvent +=new EventExample.EventPublisher.sampleEventDelegate(ResponseEvent);           publisher.sampleEvent +=new EventExample.EventPublisher.sampleEventDelegate(ResponseEvent);       }       private int ResponseEvent(string msg)       {           Console.WriteLine(msg + " --- This is from reader2");
           Console.WriteLine("Please:down enter key!");
           Console.ReadLine();        
           return 0;
       }    }}
我的代码:using System;namespace EventExample
{   
    class MainClass
    {           static void Main(string[] args)
        {            EventPublisher publisher = new EventPublisher();
            EventReader1 reader1 = new EventReader1(publisher);
            EventReader2 reader2 = new EventReader2(publisher);
            publisher.DoSomthing();
            Console.WriteLine("This program already finished!");
            Console.ReadLine();
        }    }     // EventPublisher : 事件的发布者。      public class EventPublisher
    {
        // 第一步是申明委托        public delegate  void  sampleEventDelegate (string messageInfo);
        // 第二步是申明与上述委托相关的事件        public event sampleEventDelegate sampleEvent;          public EventPublisher()
        {        }
        public void DoSomthing()
        {                    // 激发事件            if (this.sampleEvent != null)
            {           
                   this.sampleEvent("hello world");                               
            }                }    }
    // EventReader1 : 事件的订阅者1。    public class EventReader1
    {
        public EventReader1(EventPublisher publisher)
        {
            publisher.sampleEvent +=
               new EventExample.EventPublisher.sampleEventDelegate(ResponseEvent);
        }        private void ResponseEvent(string msg)
        {
            Console.WriteLine(msg + " --- This is from reader1");             }    }    // EventReader2 : 事件的订阅者2。    public class EventReader2
    {
        public EventReader2(EventPublisher publisher)
        {
            publisher.sampleEvent += new EventExample.EventPublisher.sampleEventDelegate(ResponseEvent);            publisher.sampleEvent += new EventExample.EventPublisher.sampleEventDelegate(ResponseEvent);        }        private void ResponseEvent(string msg)
        {
            Console.WriteLine(msg + " --- This is from reader2");     
            Console.WriteLine("Please:down enter key!");
            Console.ReadLine();    
        }    }}
我就是修改了下事件的委托,从而事件处理函数也都修改了各自的签名,事件被激发,处理函数被执行都没有问题,问题是两个程序都能执行到最后,而我修改的代码在事件的处理函数中根本没返回,全是void!

解决方案 »

  1.   

    看到标题想到的是
    return;看完内容,完全迷惑,不知道lz想问什么
      

  2.   

    可以通过return 跳出程序块。没事看看书好了,这应该是很基础的东西
      

  3.   

    你是想保存事件执行后的结果?
    定义一个类成员变量就可以了啊class TestEx
    {
       private string _result = string.Empty;
       public string Result
       {get{return _result;}}
       public void TestFun()
       {
            _result = "程序的方法TestFun已经执行";
       }
    }
      

  4.   

    像楼上们所说,加个变量保存结果,通过return返回这也明白。我不明白的是为什么没有renturn语句 也一样“返回”了,因为主程序一样执行到了最后!
      

  5.   

    没有return那就是函数执行到最后自己返回了
      

  6.   

    在方法中间加return;就会跳出程序块
    返回类型规定了return后面所加的量的类型,如果返回类型声明为void,则不需要返回值
    return;//在void的方法中,需要跳出它,可以直接用return而不能加任何量在后面
      

  7.   

    return;
    程序立即执行到这里,返回
      

  8.   


    也就是说对于void 函数,可以用 return; 退出程序块,由于是void ,不能返回任何值,我的void 并没有return;
    你说的 “自己返回”了貌似是合理的解释,但是“自己返回”到底是怎么回事我还是不甚明白。
      

  9.   

    return的作用:
    1.终止方法的执行。
    2.指定返回值。
    对于有返回值的,自然需要return来显式指出。
    对于没有返回值的,除了中间需要提前终止,方法执行完了也就完了。return即使有,也没有额外的效用。
      

  10.   

    void类型从严格意义上还是有返回值的 只不过函数在返回以后舍弃了这个返回值而已(有些C/C++书上写到过) return执行的语句是返回程序上一个保留点(程序在执行函数时 把当前现场都进行了保存,然后进入函数体内部执行 等遇到return语句 程序就恢复上个现场继续执行下去)
      

  11.   


    一般来说,没有返回值的函数,类似Delphi中的Procedure(过程),而有返回值的函数,类似Delphi中的Function(函数),对于没有返回值的函数,你可以把他看成是调用方的一部分,只是放到另外一个地方单独运行了而已,没有特地写return返回的话,这个函数会运行到函数的最后并结束,仅仅是函数体结束。对于你说的类似线程,也可以这么理解,但并不能用消亡这个词来描述,不是很恰当
      

  12.   

    我晕,这么基础的知识函数体结束,执行的退栈,没有返回值,就不需要压栈,所以即使最后没有return,也没有关系
    使用return,可以在函数体内的任意位置进行返回,提供了快速退出函数体的方式,免得大家用goto了
      

  13.   

    public void refAndOut(ref Object obj,out string str){
      obj=1;
      str="2";
    }