关于IssueVision命令模式中对象生命周期的困惑
生活随笔
收集整理的這篇文章主要介紹了
关于IssueVision命令模式中对象生命周期的困惑
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在IssueVision的命令模式中有如下代碼(\Patterns\Commander.cs)
??public static void Connect(ToolBarButton button, Command command)
??{
???ToolBarButtonCommander unused = new ToolBarButtonCommander(button, command);
??}
按理說unused是內(nèi)部變量,生命周期應(yīng)該在Connect方法的作用范圍內(nèi),應(yīng)該馬上被銷毀,或者說垃圾回收器可以隨時(shí)回收這個(gè)對(duì)象,? 但是這個(gè)對(duì)象的生命周期跟主窗體一樣.
于是根據(jù)以上代碼就設(shè)想,當(dāng)一個(gè)類內(nèi)部變量被一個(gè)外部變量引用時(shí),那么在外部變量被銷毀前這個(gè)類是不會(huì)被銷毀的,以下就是一段測(cè)試代碼來做這個(gè)試驗(yàn)(注意結(jié)果是否定的)
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);
????????}
????}
??public static void Connect(ToolBarButton button, Command command)
??{
???ToolBarButtonCommander unused = new ToolBarButtonCommander(button, command);
??}
按理說unused是內(nèi)部變量,生命周期應(yīng)該在Connect方法的作用范圍內(nèi),應(yīng)該馬上被銷毀,或者說垃圾回收器可以隨時(shí)回收這個(gè)對(duì)象,? 但是這個(gè)對(duì)象的生命周期跟主窗體一樣.
于是根據(jù)以上代碼就設(shè)想,當(dāng)一個(gè)類內(nèi)部變量被一個(gè)外部變量引用時(shí),那么在外部變量被銷毀前這個(gè)類是不會(huì)被銷毀的,以下就是一段測(cè)試代碼來做這個(gè)試驗(yàn)(注意結(jié)果是否定的)
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 是窗體級(jí)的變量(private?Object obj=null;)
???????????? for (int i = 1; i < 20; i++)
??????????? {
??????????????? TestClass2.Connected( "1X" + i,null);
??????????????? TestClass2.Connected("2X" + i,obj);
??????????????? Application.DoEvents();
??????????? }
結(jié)果是運(yùn)行后會(huì)彈出2X,1X這樣的對(duì)話框表示,這個(gè)類,被銷毀了!!!
但是IssueVision里的Commander確沒問題,!!
轉(zhuǎn)載于:https://www.cnblogs.com/wdfrog/archive/2007/08/07/845799.html
總結(jié)
以上是生活随笔為你收集整理的关于IssueVision命令模式中对象生命周期的困惑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么也不用说是什么歌啊?
- 下一篇: 转 --有些事情需要注意