在学习别人的一个事件的例子中忽然想到了这个问题,我们在做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!
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!
return;看完内容,完全迷惑,不知道lz想问什么
定义一个类成员变量就可以了啊class TestEx
{
private string _result = string.Empty;
public string Result
{get{return _result;}}
public void TestFun()
{
_result = "程序的方法TestFun已经执行";
}
}
返回类型规定了return后面所加的量的类型,如果返回类型声明为void,则不需要返回值
return;//在void的方法中,需要跳出它,可以直接用return而不能加任何量在后面
程序立即执行到这里,返回
也就是说对于void 函数,可以用 return; 退出程序块,由于是void ,不能返回任何值,我的void 并没有return;
你说的 “自己返回”了貌似是合理的解释,但是“自己返回”到底是怎么回事我还是不甚明白。
1.终止方法的执行。
2.指定返回值。
对于有返回值的,自然需要return来显式指出。
对于没有返回值的,除了中间需要提前终止,方法执行完了也就完了。return即使有,也没有额外的效用。
一般来说,没有返回值的函数,类似Delphi中的Procedure(过程),而有返回值的函数,类似Delphi中的Function(函数),对于没有返回值的函数,你可以把他看成是调用方的一部分,只是放到另外一个地方单独运行了而已,没有特地写return返回的话,这个函数会运行到函数的最后并结束,仅仅是函数体结束。对于你说的类似线程,也可以这么理解,但并不能用消亡这个词来描述,不是很恰当
使用return,可以在函数体内的任意位置进行返回,提供了快速退出函数体的方式,免得大家用goto了
obj=1;
str="2";
}