关于IssueVision命令模式中对象生命周期的困惑
生活随笔
收集整理的這篇文章主要介紹了
关于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);
????????}
????}
??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確沒問題,!!
轉載于:https://www.cnblogs.com/wdfrog/archive/2007/08/07/845799.html
總結
以上是生活随笔為你收集整理的关于IssueVision命令模式中对象生命周期的困惑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么也不用说是什么歌啊?
- 下一篇: 转 --有些事情需要注意