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确没问题,!!

  • 相关阅读:
    CRM安装过程问题总结
    SQL Server Active Directory Helper 无法启动
    CRM导出Excel记录的最大数量
    CRM名词解释
    CRM根据不同的角色过滤视图
    asp.net C# webservice安全性方案
    利用MSCRM4.0 Trace功能跟踪详细错误信息
    事件1058处理过程,处理组策略失败.
    在 Windows Server 2003 中配置网络负载平衡
    对比SQL中简单嵌套查询与非嵌套查询的异同
  • 原文地址:https://www.cnblogs.com/wdfrog/p/845799.html
Copyright © 2011-2022 走看看