zoukankan      html  css  js  c++  java
  • 关于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确没问题,!!

  • 相关阅读:
    运算符重载
    LPCRITICAL_SECTION 函数
    让你弄明白高斯核是怎样进行滤波工作的
    sln文件
    内联函数
    C++对文本的操作
    数组形参
    内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理]
    怎样对付win7黑屏
    C++ 模板
  • 原文地址:https://www.cnblogs.com/wdfrog/p/845799.html
Copyright © 2011-2022 走看看