• 关于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);

            }

        }


    在form_load中有下面代码
    obj 是窗体级的变量(private Object obj=null;)
                 for (int i = 1; i < 20; i++)
                {

                    TestClass2.Connected( "1X" + i,null);
                    TestClass2.Connected("2X" + i,obj);
                    Application.DoEvents();
                }
    结果是运行后会弹出2X,1X这样的对话框表示,这个类,被销毁了!!!

    但是IssueVision里的Commander确没问题,!!

  • 相关阅读:
    mysql数据向Redis快速导入
    jquery.cookie.js使用
    怎么才能在职场中如鱼得水(转)
    内部类(编程思想)
    main方法原来只要放在public static类中就能跑,涨知识了
    匿名内部类--工厂
    Java通过继承外部类来建立该外部类的protected内部类的实例(转)
    监听器的使用例子 ServletContextListener
    Class.getResource()方法的使用
    maven打包资源文件(转)
  • 原文地址:https://www.cnblogs.com/wdfrog/p/845799.html
Copyright © 2020-2023  润新知