积极答复者
帮忙看看///后面的问题,谢谢。

问题
-
using System;
using System.Collections.Generic;
using System.Text;namespace ConsoleEvents2
{
class Class1
{
//声明一个委托 delegate FireEventHandler,delegate 没有 静态或实例 成员的说法
public delegate void FireEventHandler(string s);//声明 FireEventHandler 委托类型的事件
//亦即将 FireEventHandler 理解为数据类型,易理解
public event FireEventHandler FireInstance;
public static event FireEventHandler FireStatic;static void Main(string[] args)
{
System.Console.WriteLine("Hello World");//用 delegate: FireEventHandler() 委托,建立委托关系
//Static 方法 FireStatic() 代理(被委托)了 Static 方法 Fire1()
FireStatic += new FireEventHandler(Fire1);
//Static 方法 FireStatic() 代理(被委托)了 Instance 方法 .Fire2()
FireStatic = FireStatic + new FireEventHandler(new Class1().Fire2);///这种用a=a+new(b)的写法与上面a+=new b的写法可以互换么?全都一样么?Class1 c = new Class1();
//Instance 方法 .FireInstance() 代理(被委托)了 Instance 方法 .Fire2()
c.FireInstance += new FireEventHandler(c.Fire2);//Instance 方法 .FireInstance() 代理(被委托)了 Static 方法 Fire1()
c.FireInstance = new FireEventHandler(Fire1) + c.FireInstance;
//以上仅是声明了委托关系,尚未执行 委托代理方法 !System.Console.WriteLine("下面列印委托关系:");
System.Console.WriteLine("Static 方法 FireStatic() 作为代理接受以下委托:");ListDelegateRelation(FireStatic);
System.Console.WriteLine();
System.Console.WriteLine("Instance 方法 .FireInstance() 作为代理接受以下委托:");
ListDelegateRelation(c.FireInstance);System.Console.WriteLine("请键入任意字符(串),\"q\" 退出!");
string s;
while (true)
{
s = System.Console.ReadLine();
System.Console.WriteLine("--------------------------");
System.Console.WriteLine("以下是键入 \"{0}\" 后,触发事件的响应:");
//我们在此编程,即:在接受屏幕行录入后,令程序执行委托代理方法!
//从而触发了事件!
// FireStatic 静态事件被触发了
FireStatic("FireStatic 静态事件被触发了:\nStatic 方法 FireStatic() 受委托代理执行了 {0}\n你键入了: [" + s + "]\n");// .FireInstance 实例事件被触发了
c.FireInstance(".FireInstance 实例事件被触发了: \nInstance 方法 .FireInstance() 受委托代理执行了 {0}\n你键入了: [" + s + "]\n");
System.Console.WriteLine("=======================================");
System.Console.WriteLine("请键入任意字符(串),\"q\" 退出!");
if (s == "q")
break;
}
///*
//解除委托关系可用 "-="
//下面解除委托,列印剩余委托关系
ListDelegateRelation(FireStatic); ///为什么运行到这一句,FireStatic.ToString()的值是 ConsoleEvents2.Class1+FireEventHandler?FireStatic -= new FireEventHandler(Fire1);
ListDelegateRelation(FireStatic);FireStatic = FireStatic - new FireEventHandler(new Class1().Fire2);///这一句可以写成FireStatic -=new FireEventHandler(new Class().Fire2)么?为什么?
ListDelegateRelation(FireStatic);c.FireInstance = new FireEventHandler(Fire1) - c.FireInstance;///这一句是不是在“-”的左右写反了?应该是 c.FireInstance-new FireEventHandler(Fire1)呢?
ListDelegateRelation(c.FireInstance);c.FireInstance = c.FireInstance - new FireEventHandler(Fire1);
ListDelegateRelation(c.FireInstance);//*/
Console.Read();
}//静态方法
static void Fire1(string s)
{
//响应事件的程序
System.Console.WriteLine(s.Replace("{0}", "static 方法 Fire1()"));
}//实例方法
void Fire2(string s)
{
//响应事件的程序
System.Console.WriteLine(s.Replace("{0}", "Instance 方法 .Fire2()"));
}static void ListDelegateRelation(FireEventHandler x)
{
if (x != null)
{
// foreach (System.Delegate d in x.GetInvocationList())
foreach (FireEventHandler d in x.GetInvocationList())
{
System.Console.WriteLine(x.ToString() + " 类型的事件代理了 " + (d.Method.IsStatic ? x.Target + " 类的 Static 方法 " : d.Target + " 的 Instance 方法 .") + d.Method.Name);
}
}
else
{
System.Console.WriteLine("没有任何委托关系");
}
}
}
}
maiyude
答案
全部回复
-
我又找一个问题了。
执行后,屏幕上是
ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了 ConsoleEvents2.Class1 类
的 Static 方法 Fire1
ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了 ConsoleEvents2.Class1 的
Instance 方法 .Fire2
ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了 ConsoleEvents2.Class1 的
Instance 方法 .Fire2
ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了 ConsoleEvents2.Class1 的
Instance 方法 .Fire2
ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了 类的 Static 方法 Fire1
没有任何委托关系
为什么最后在,"没有任何委托关系"的前面是 “ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了 类的 Static 方法 Fire1”,这里面的“ 类的Static 方法 Fire1”的名字怎么没像上面那样打印出来呢?
maiyude -
你好!
你打个在foreach循环内打个断点,然后看看最后一次循环的x.Target是否为null!
周雪峰- 已建议为答案 Mack Juesson 2009年1月31日 7:12