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;
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("没有任何委托关系");
}
}
}
}
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;
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("没有任何委托关系");
}
}
}
}
c.FireInstance = new FireEventHandler(Fire1) - c.FireInstance;///这一句是不是在“-”的左右写反了?应该是 c.FireInstance-new FireEventHandler(Fire1)呢?
//Static 方法 FireStatic() 代理(被委托)了 Instance 方法 .Fire2()
FireStatic = FireStatic + new FireEventHandler(new Class1().Fire2);///这种用a=a+new(b)的写法与上面a+=new b的写法可以互换么?全都一样么?
两句完全一样。。楼主基础太差ListDelegateRelation(FireStatic); ///为什么运行到这一句,FireStatic.ToString()的值是 ConsoleEvents2.Class1+FireEventHandler?
FireStatic是一个事件。。事件是一种特殊的委托类型
而static void ListDelegateRelation(FireEventHandler x)
此处x是一个FireEventHandler类型,这就不难解释为什么x.ToString()会输出ConsoleEvents2.Class1.FireEventHandler FireStatic = FireStatic - new FireEventHandler(new Class1().Fire2);///这一句可以写成FireStatic -=new FireEventHandler(new Class().Fire2)么?为什么?
完全可以,用法不一样而已
例i=i+1;与i+=1;是一样的
FireStatic += new FireEventHandler(new Class1().Fire2);FireStatic = FireStatic - new FireEventHandler(new Class1().Fire2);///这一句可以写成FireStatic -=new FireEventHandler(new Class().Fire2)么?为什么?这句同样的道理可以写成:
FireStatic -= new FireEventHandler(new Class1().Fire2);
的 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”的名字怎么没像上面那样打印出来呢?