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

  • 相关阅读:
    VS提示“项目文件" "已被重命名或已不在解决方案中”的解决办法 .
    微信公众平台教程和SDK收集
    “SQLServerAgent当前未运行”问题解决
    $(document).click() 在苹果手机上不能正常运行
    友盟iOS推送配置(从真机调试到推送)
    Ubuntu安装VMware Tools的方法
    TortoiseSVN客户端如何更改新的URL
    Windows Server 2008系统如何取消登录时要按Ctrl+Alt+Delete组合键
    Windows Server 2008 显示桌面图标
    用WinRAR进行安装包的制作
  • 原文地址:https://www.cnblogs.com/wdfrog/p/845799.html
Copyright © 2011-2022 走看看