2015-02-08 76 views
0

我用來硬編碼Windows.Forms的控件組件;例如MenuStrip。但我不確定這些定義的正確位置:將它放在方法中還是它必須位於類定義的頂層是安全的?我已經試過並且都按預期編譯和運行。但是第一種選擇(在方法中定義)使菜單項在方法中是本地的,儘管我在該方法中添加了控件,但我害怕內存問題。在哪裏放置MenuStrip及其物品?

請參見下面的代碼:

namespace test 
{ 
    class FormTest : Form 
    { 
     // if placed in the top level of the class —as below— it works fine. 
     // MenuStrip menuMain = new MenuStrip(); 
     // ToolStripMenuItem exit = new ToolStripMenuItem(); 

     public FormTest() 
     { 
      this.FormTest_MenuStrip_Setup(); 
     } 

     private void FormTest_MenuStrip_Setup() 
     { 
      // if placed in a method —like below— it works fine either. 
      MenuStrip menuMain = new MenuStrip(); 
      ToolStripMenuItem exit = new ToolStripMenuItem(); 

      exit.Text = "Exit"; 
      exit.Click += FormMain_Exit_Click; 
      menuMain.Items.Add(exit); 
      this.Controls.Add(menuMain); 
     } 
    } 
} 

回答

3

通常開發商做使用的WinForms設計師,這使(您將窗體上任何其他控件)所有菜單項作爲類級別成員的聲明的東西在FormTest.designer.cs(或任何您的窗體名稱)中,並在InitializeComponent()方法中初始化它們。在做其他事情之前,你必須確保你的構造函數調用InitializeComponent()

如果您不想使用設計器,您可以定義自己的創建菜單或其他控件的方法,這種特殊的安排不是必需的。只要確保你在構造函數中調用了這個方法。另外請注意,在方法中聲明這些控件/菜單項並不是問題,因爲一旦調用this.Controls.Add(YourControl),該對象的引用已被保存,因此即使對象在方法結束後超出範圍,GC也不會擦除該對象。

我寧可推薦反對重新發明這個輪子。除非您有充分的理由手動編寫表單的佈局,否則設計師在這裏做得非常好。

+0

謝謝,你的回答非常透徹。 – ssd 2015-02-08 13:41:07