现在的位置: 首页 > 综合 > 正文

静态类构造事件简介

2014年04月05日 ⁄ 综合 ⁄ 共 3361字 ⁄ 字号 评论关闭

静态类

构造初始化

         静态类已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:构造时间在第一次使用时候,那么启用注释1Listen.User();才能监听到两次事件。

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

 

抱歉!评论已关闭.