静态类
构造初始化
静态类已static为标示,不可继承(只能充object继承)和被继承(静态类是密封型的),可以添加构造函数,但是必须是无参数的默认构造函数。
静态类创建时间
静态类的构造时间准确的说应该是在你使用该类的第一次时候创建,换言之,如果你定义了静态类,但是一直没有使用,那么这个静态类是没有被构造出的,这样就节约了内存。静态类的构造次数只有一次,编译器会保证只有一个静态类的存在。
下面有测试代码:
采用事件机制测试。
定义静态类
public static class Listen
{
private static Delegate m_StatusBarLoad = null;
static Listen()
{
m_StatusBarLoad = new EventHandler(_MenuLoad);
EventDispatcher.AddEventListen("Load", m_StatusBarLoad);
}
public static void User()
{
}
private static void _MenuLoad(object sender, EventArgs e)
{
MessageBox.Show("监听到第二个事件");
}
}
事件添加分发类;该类详情请查看另一篇文章。
public static class EventDispatcher
{
/// <summary>
/// 字典存储所有事件注册静态变量为了所有类都可以访问
/// </summary>
private static Dictionary<string, Delegate> m_EventList = new Dictionary<string, Delegate>();
/// <summary>
/// 注册事件监听
/// </summary>
/// <paramname="PEventName">事件名称</param>
/// <paramname="PMethod">处理事件的委托方法</param>
public static void AddEventListen(string PEventName, Delegate PMethod)
{
Monitor.Enter(m_EventList);
Delegate POut = null;
if (m_EventList.TryGetValue(PEventName, out POut))
{
m_EventList[PEventName] = Delegate.Combine(POut, PMethod);
//支持委托连
}
else
{
m_EventList.Add(PEventName, PMethod);
}
Monitor.Exit(m_EventList);
}
/// <summary>
/// 分发事件在字典中查找注册到
/// </summary>
/// <paramname="PEventName"></param>
/// <paramname="Sender"></param>
/// <paramname="e"></param>
public static void DispatchEvent(string PEventName, object Sender, object e)
{
Monitor.Enter(m_EventList);
Delegate POut = null;
if (m_EventList.TryGetValue(PEventName, out POut))
{
POut.DynamicInvoke(new object[] { Sender, e });
}
Monitor.Exit(m_EventList);
}
/// <summary>
/// 删除事件
/// </summary>
/// <param name="PEventName"></param>
/// <param name="PMethod"></param>
public static void RemoveEventLIsten(string PEventName, Delegate PMethod)
{
Monitor.Enter(m_EventList);
Delegate POut = null;
POut = Delegate.Remove(POut, PMethod);
if (POut == null)
{
m_EventList.Remove(PEventName);
}
else
{
m_EventList[PEventName] = POut;
}
Monitor.Exit(m_EventList);
}
}
下面为Form窗体下的代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Delegate m_StatusBarLoad = null;
private void _MenuLoad(object sender, EventArgs e)
{
MessageBox.Show("监听到第一个事件");
}
private void Form1_Load(object sender, EventArgs e)
{
m_StatusBarLoad = new EventHandler(_MenuLoad);
EventDispatcher.AddEventListen("Load", m_StatusBarLoad);
//注释1
EventDispatcher.DispatchEvent("Load",this,null);
//注释2
//Listen.User();
}
}
红色代码为两处添加事件监听,一个在主窗体下,另一个则在静态类中。
先提出两种假设:
1:如果静态类构造实在程序加载时候。那么两处Listen.User();都注释掉一样可以监听到两次事件。
2:构造时间在第一次使用时候,那么启用注释1的Listen.User();才能监听到两次事件。
测试结果各位可以自己试试。