日期:2014-05-18  浏览次数:20983 次

关于IssueVision命令模式中对象生命周期的困惑
在IssueVision的命令模式中有如下代码(\Patterns\Commander.cs)
    public   static   void   Connect(ToolBarButton   button,   Command   command)
    {
      ToolBarButtonCommander   unused   =   new   ToolBarButtonCommander(button,   command);
    }
按理说unused是内部变量,生命周期应该在Connect方法的作用范围内,应该马上被销毁,或者说垃圾回收器可以随时回收这个对象,     但是这个对象的生命周期跟主窗体一样.

于是根据以上代码就设想,当一个类内部变量被一个外部变量引用时,那么在外部变量被销毁前这个类是不会被销毁的,以下就是一段测试代码来做这个试验(注意结果是否定的)
public   class   TestClass2
        {
                private   string   m_Name;
                private   string[]   m_Arr   =   new   string[10000];
                Button   m_but=null;
                public   Command   m_Command;
                public   TestClass2(   string   name,Object   obj)
                {


                        m_Name   =   name;
                        for   (int   i   =   0;   i   <   10000;   i++)
                        {
                                m_Arr[i]   =   "adssssssssssssssssssssssssssssssssssssssssssssssssssssss ";
                        }
                        if   (obj   !=   null)
                        {
                                obj   =   m_Arr;
                        }
                }
                private   void   HandleEvent(object   sender,   EventArgs   e)
                {
                        m_Command.Execute();
                }
                ~TestClass2()
                {
                        MessageBox.Show(m_Name   +   ":我被销毁 ");
                }
                public   static   void   Connected(Button   but,   string   name,Object   obj)
                {
                        TestClass2   tstcls   =   new   TestClass2(name,obj