静态类构造事件简介

静态类

构造初始化

静态类已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

// Listen.User();

 

EventDispatcher.DispatchEvent(“Load”,this,null);

 

//注释2

//Listen.User();

}

}

 

红色代码为两处添加事件监听,一个在主窗体下,另一个则在静态类中。

先提出两种假设:

1:如果静态类构造实在程序加载时候。那么两处Listen.User();都注释掉一样可以监听到两次事件。

2:构造时间在第一次使用时候,那么启用注释1的Listen.User();才能监听到两次事件。

测试结果各位可以自己试试。

 

标签