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。为什么会这样?
{
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。为什么会这样?
解决方案 »
- 停止线程画面就冻结了
- 统计一个采用邻结矩阵存储,具有N个顶点的无向图无权图的所有顶点的度。测试出现索引超出了数组界限。???
- 关于业务逻辑的问题
- gradeview能直接录入数据吗?
- 如何解决HashTable添加数据时插入重复键
- 在c#连接数据库时,怎么处理不是同一个数据库的信息
- C#.net怎么样打开低版本c#.net的源程序?
- 请问,Linq查询对应不同的字段,如何封装方法?求大神.
- 求助 急 大家帮帮忙
- 字段全部是公有的不好之处在那里,能不能说得具体些?
- 为什么我用 WebRequest 或 Webclient 采集数据时都一运行程序就无响应的呢?
- webclient.uploaddata 提示“不支持 URI 格式。”
{
static void Main(string[] args)
{
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(ref Number); Console.Read();
}
} class Publishser
{
public delegate void DemoEventHandler(ref int num); //定义委托,可代表的方法类型是整形
public event DemoEventHandler NumberChanged; //申明事件
public void DoComething(ref int temp)
{
if (NumberChanged != null)
{
NumberChanged(ref temp);
}
Console.WriteLine(temp.ToString());
}
} class Subscriber1
{
public void OnNumberChanged(ref int num)
{
Console.WriteLine("调用了Subscriber1类,num值为:" + num);
num += 100;
}
} class Subscriber2
{
public void OnNumberChanged(ref int num)
{
Console.WriteLine("调用了Subscriber2类 num值为:" + num);
num += 100;
}
} class Subscriber3
{
public void OnNumberChanged(ref int num)
{
Console.WriteLine("调用了Subcriber3类,num值为:" + num);
num += 100;
}
}