C#事件演示程序3)——体会事件更本质的东西
2006-10-10 10:42
330 查看
我在上篇 文章中对事件的分析还是比较片面的。这是昨天晚上回家又仔细研究了一下才发现的。
因为我本来就觉得有些地方还是没弄清楚。比如事件的代理一定是EventHandler或派生类吗?签名必须有参数吗?某个类对事件的注册只能写在类的内部构造函数中吗?不能写在外部吗?其事件处理函数只能是非静态的吗?不能是静态的吗?昨天本以为对事件有了比较全面的认识了,但似乎总觉得哪里不对劲,或者似乎对事件的理解非常死板,思路自己都觉得僵化的很。隐隐带着这些疑问,又参考了一下《C#完全手册》,这些问题迎刃而解。
下面是我写的例子:
A)
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication4
...{
public class Program
...{
static void Main(string[] args)
...{
MyEvent myEventIns = MyEvent.Instance;
MyListener Listener = new MyListener();
myEventIns.myEvent += new MyDelegate(Listener.DisplayString);
myEventIns.OnMyEvent();
}
}
public class MyListener
...{
public MyListener()
...{
}
public void DisplayString()
...{
Console.WriteLine("hello!Welcome to my blog!");
}
}
public delegate void MyDelegate();
public class MyEvent
...{
private static MyEvent _instance = new MyEvent();
public static MyEvent Instance
...{
get ...{ return _instance; }
}
private MyEvent()
...{
}
public event MyDelegate myEvent;
public void OnMyEvent()
...{
RaiseMyEvent();
}
private void RaiseMyEvent()
...{
if (myEvent != null)
...{
myEvent();
}
}
}
}
B)把事件处理方法改成静态的:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication4
...{
public class Program
...{
static void Main(string[] args)
...{
MyEvent myEventIns = MyEvent.Instance;
//Listener Listener = new Listener();
myEventIns.myEvent += new MyDelegate(Listener.DisplayString);
myEventIns.OnMyEvent();
}
}
public class Listener
...{
//public Listener()
//{
// MyEvent.Instance.myEvent += new MyDelegate(DisplayString);
//}
//public void DisplayString()
//{
// Console.WriteLine("hello!Welcome to my blog!");
//}
public static void DisplayString()
...{
Console.WriteLine("hello!Welcome to my blog!");
}
}
public delegate void MyDelegate();
public class MyEvent
...{
private static MyEvent _instance = new MyEvent();
public static MyEvent Instance
...{
get ...{ return _instance; }
}
private MyEvent()
...{
}
public event MyDelegate myEvent;
public void OnMyEvent()
...{
RaiseMyEvent();
}
private void RaiseMyEvent()
...{
if (myEvent != null)
...{
myEvent();
}
}
}
}
因为我本来就觉得有些地方还是没弄清楚。比如事件的代理一定是EventHandler或派生类吗?签名必须有参数吗?某个类对事件的注册只能写在类的内部构造函数中吗?不能写在外部吗?其事件处理函数只能是非静态的吗?不能是静态的吗?昨天本以为对事件有了比较全面的认识了,但似乎总觉得哪里不对劲,或者似乎对事件的理解非常死板,思路自己都觉得僵化的很。隐隐带着这些疑问,又参考了一下《C#完全手册》,这些问题迎刃而解。
下面是我写的例子:
A)
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication4
...{
public class Program
...{
static void Main(string[] args)
...{
MyEvent myEventIns = MyEvent.Instance;
MyListener Listener = new MyListener();
myEventIns.myEvent += new MyDelegate(Listener.DisplayString);
myEventIns.OnMyEvent();
}
}
public class MyListener
...{
public MyListener()
...{
}
public void DisplayString()
...{
Console.WriteLine("hello!Welcome to my blog!");
}
}
public delegate void MyDelegate();
public class MyEvent
...{
private static MyEvent _instance = new MyEvent();
public static MyEvent Instance
...{
get ...{ return _instance; }
}
private MyEvent()
...{
}
public event MyDelegate myEvent;
public void OnMyEvent()
...{
RaiseMyEvent();
}
private void RaiseMyEvent()
...{
if (myEvent != null)
...{
myEvent();
}
}
}
}
B)把事件处理方法改成静态的:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication4
...{
public class Program
...{
static void Main(string[] args)
...{
MyEvent myEventIns = MyEvent.Instance;
//Listener Listener = new Listener();
myEventIns.myEvent += new MyDelegate(Listener.DisplayString);
myEventIns.OnMyEvent();
}
}
public class Listener
...{
//public Listener()
//{
// MyEvent.Instance.myEvent += new MyDelegate(DisplayString);
//}
//public void DisplayString()
//{
// Console.WriteLine("hello!Welcome to my blog!");
//}
public static void DisplayString()
...{
Console.WriteLine("hello!Welcome to my blog!");
}
}
public delegate void MyDelegate();
public class MyEvent
...{
private static MyEvent _instance = new MyEvent();
public static MyEvent Instance
...{
get ...{ return _instance; }
}
private MyEvent()
...{
}
public event MyDelegate myEvent;
public void OnMyEvent()
...{
RaiseMyEvent();
}
private void RaiseMyEvent()
...{
if (myEvent != null)
...{
myEvent();
}
}
}
}
相关文章推荐
- C#事件演示程序4)——一段经典的代码
- C#事件演示程序1)——一个最简单的C#事件处理程序
- C#事件演示程序2)——写事件的三点注意,以及常用的事件处理模型
- 一个演示多线程操作及同步的C#程序
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
- 编写高质量代码改善C#程序的157个建议——建议154:不要过度设计,在敏捷中体会重构的乐趣
- C#之事件体会(一)
- C#中动态创建控件及事件处理程序
- C#控制台程序中处理2个关闭事件的代码实例
- 一个程序帮助你熟悉和使用C#中委托和事件
- 学习c#的事件时写的一个小程序
- C#中事件处理的个人体会
- C#:一个增强的TcpListener(*)服务器演示程序及源代码下载
- 【微信小程序】事件交互案例演示
- c# 清除别人的控件中的原有事件处理程序
- C#:一个增强的TcpListener(*)服务器演示程序及源代码下载
- c#给用户控件添加事件处理程序
- C#中事件处理的个人体会
- C#事件-探寻事件本质
- c#写的五子棋程序,供学习WinForms的鼠标事件和使用GDI+