首页 > 关于IssueVision命令模式中对象生命周期的困惑

关于IssueVision命令模式中对象生命周期的困惑

在IssueVision的命令模式中有如下代码(PatternsCommander.cs)

  public static void Connect(ToolBarButton button, Command command)

  {

   ToolBarButtonCommander unused = new ToolBarButtonCommander(button, command);

  }

按理说unused是内部变量,生命周期应该在Connect方法的作用范围内,应该马上被销毁,或者说垃圾回收器可以随时回收这个对象,  但是这个对象的生命周期跟主窗体一样.



于是根据以上代码就设想,当一个类内部变量被一个外部变量引用时,那么在外部变量被销毁前这个类是不会被销毁的,以下就是一段测试代码来做这个试验(注意结果是否定的)

None.gifpublic class TestClass2

ExpandedBlockStart.gifContractedBlock.gif    
dot.gif{

InBlock.gif        
private string m_Name;

InBlock.gif        
private string[] m_Arr = new string[10000];

InBlock.gif        Button m_but
=null;

InBlock.gif        
public Command m_Command;

InBlock.gif        
public TestClass2( string name,Object obj)

ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{

InBlock.gif

InBlock.gif

InBlock.gif            m_Name 
= name;

InBlock.gif            
for (int i = 0; i < 10000; i++)

ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{

InBlock.gif                m_Arr[i] 
= "adssssssssssssssssssssssssssssssssssssssssssssssssssssss";

ExpandedSubBlockEnd.gif            }


InBlock.gif            
if (obj != null)

ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{

InBlock.gif                obj 
= m_Arr;

ExpandedSubBlockEnd.gif            }


ExpandedSubBlockEnd.gif        }


InBlock.gif        
private void HandleEvent(object sender, EventArgs e)

ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{

InBlock.gif            m_Command.Execute();

ExpandedSubBlockEnd.gif        }


InBlock.gif        
~TestClass2()

ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{

InBlock.gif            MessageBox.Show(m_Name 
+ ":我被销毁");

ExpandedSubBlockEnd.gif        }


InBlock.gif        
public static void Connected(Button but, string name,Object obj)

ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{

InBlock.gif            TestClass2 tstcls 
= new TestClass2(name,obj);

InBlock.gif

ExpandedSubBlockEnd.gif        }


ExpandedBlockEnd.gif    }



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

转载于:https://www.cnblogs.com/wdfrog/archive/2007/08/07/845799.html

更多相关:

  • /*js中遍历对象属性*/ function printObject(obj) {var temp = "";for (var key in obj) {temp += key + ":" + obj[key] + " ";}return temp; }/*测试用例*/ var obj = {"a": "1", "b": "2"};...

  •     /* @flow */ // Object.freeze 使得这个对象不能增加属性, 修改属性, 这样就保证了这个对象在任何时候都是空的 export const emptyObject = Object.freeze({}) /*** Check if a string starts with $ or _ ascii u...

  • 当使用jquery1.3以上版本时,进行ajax参数传值时,会出现以下的一个错误:  ognl.ExpressionSyntaxException: Malformed OGNL expression: f[] [ognl.ParseException: Encountered " "]" "] "" at line 1, col...

  • 多线程编程 mind-Mapping保存有一下导图的xmind文件,可直接获取 互斥变量 互斥对象 ptrhead相关接口 条件变量 future异步访问类 async类 promise类 package_task类...

  • 我们在实际开发的过程中,可能需要某些类的成员变量并不是针对每一个对象的,而是针对每一个类而言的,比如在银行中有一个利率数据,我们希望的是,当一个利率改变的时候,所有的对象都能够看到这个改变的数据,并利用它,而不是每一个对象都有一个利率成员变量。这个时候就设计到了静态成员变量。 一. 内存那些事 静态成员变量是存放在静态...

  • volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触...

  •   引子     阅读以下代码,并尝试分析 代码解析 在主线程中,线程Id为1,为线程变量赋值 变量==d6ff开启一个新的task,此时线程Id为4,变量==d6ff,并调用Task1开启一个同步Task3,线程Id为1。变量==d6ff,修改值==f598此时第二步启动的Task1运行,线程Id为4,变量==d6ff,修改值=...

  • 操作系统基础    操作系统是协调、控制、管理计算机硬件资源与软件资源的控制程序 为什么要用操作系统?    1.操作系统可以把复杂的操作简化给用户使用或者应用程序  2.可以让应用程序对计算机硬件竞争变的有序  一套完整的计算机分为:操作系统、应用程序、计算机硬件 编程语言的分类   机械语言:使用二进制让计算机工作   优点:运行...

  • importjava.security.SecureRandom;importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax.crypto.SecretKeyFactory;importjavax.crypto.spec.DESKeySpec;//结果与DES算...

  • 题目:替换空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 输入:s = "We are happy." 输出:"We%20are%20happy." 限制: 0 <= s 的长度 <= 10000 解题: 时间复杂度:O(n) 空间复杂度:O(n) class Solution { public:s...

  • 在C++11标准库中,string.h已经添加了to_string方法,方便从其他类型(如整形)快速转换成字面值。 例如: for (size_t i = 0; i < texArrSize; i++)RTX_Shader.SetInt(string("TexArr[") + to_string(i) + "]", 7 + i);...

  • Ubuntu 14.04安装并升级之后,变成楷体字体非常难看,我昨天搞了一晚上,终于理了个头绪,这里整理一下。 经过网上调研,大家的一致看法是,使用开源字体库文泉驿的微黑字体效果比较理想,甚至效果不输windows平台的雅黑字体。下面我打算微黑来美化Ubuntu 14.04. 1.安装文泉驿微黑字体库 sudo aptitude...

  • 使用string时发现了一些坑。 我们知道stl 容器并不是线程安全的,所以在使用它们的过程中往往需要一些同步机制来保证并发场景下的同步更新。 应该踩的坑还是一个不拉的踩了进去,所以还是记录一下吧。 string作为一个容器,随着我们的append 或者 针对string的+ 操作都会让string内部的数据域动态增加,而动态增加的...