2011-08-04 57 views
1

自從我開始爲.NET編寫各種語言的程序並進行編程時,我被告知程序中任何內容的「全局」都非常糟糕。這個想法對我來說似乎沒有任何意義。在過去的10到13年中,他一直是程序員/軟件開發人員,我接受這樣一個事實,即作爲一名程序員,如果不使用全局對象或變量,就不能編寫代碼。全球窗口形式比。本地或私人窗口形式

確實全局變量或對象可能會導致程序中的錯誤,但這並不意味着它是由於編程語言或編譯器本身,而是程序員自己或她自己。

就全局窗體形式而言,當您無法傳入實例時,您希望如何在事件中以程序的其他部分以編程方式更改「SAME」窗口窗體屬性形式作爲參數。如果一個窗體不是全局的,那麼每次程序需要顯示或改變其屬性時,都必須在本地實例化一個新窗體,但是新窗體將不會與您打開的第一個窗體相同。如果表單在私有,受保護或公共部分的類中聲明,那麼該類需要實例化,然後表單本身需要實例化並在需要的地方傳遞。我相信你會遇到一些其他的編程問題。

我甚至不知道他們爲什麼甚至會改變CLOSE方法的真正定義。關閉意味着關閉不處理。

我並不是想要放下全球化的壞想法。我只是想了解爲什麼以及以何種方式。

有人可以解釋一下,並給我一個例子,說明如何在沒有單個「GLOBAL」窗口或者甚至是變量的情況下完全編程?假設一個程序有兩個窗口窗體。一個是主要形式,另一個形式有Ttimer和一個標籤。主窗體有一個Tbutton和點擊事件,打開第二個窗體。第二種形式Timer有一個Tick事件,它每秒將當前日期和時間設置爲它的標籤文本屬性。當你點擊TButton時,它應該打開第二個窗體並且每秒顯示當前的日期和時間。現在,向我展示用C#或Delphi XE或Prism或C++或VB描述的上述程序的代碼,但不包含任何全局變量(S)。

感謝,

+2

爲什麼不能將第二個窗體作爲主窗體的私有成員變量,並通過Form.Show()和Form.Hide()隱藏或顯示? –

回答

4

這裏是沒有全局計時器形式的非常基本的版本(處置等或註銷事件代碼,但你的想法):

主要形式:

public partial class MainForm : Form 
{ 
    // local reference to the timer form 
    private readonly TimerForm _timerForm; 

    public MainForm() 
    { 
     InitializeComponent(); 

     // just create it once 
     _timerForm = new TimerForm(); 
    } 

    private void btnShowDateTime_Click(object sender, EventArgs e) 
    { 
     // show the form, no need to instantiate it 
     _timerForm.Show(); 
    } 
} 

定時器形式:

public partial class TimerForm : Form 
{ 
    private Timer _timer = new Timer(); 

    public TimerForm() 
    { 
     InitializeComponent(); 
     _timer.Interval = 1000; 
     _timer.Tick += _timer_Tick; 
     _timer.Start(); 
    } 

    void _timer_Tick(object sender, EventArgs e) 
    { 
     lblDateTime.Text = DateTime.Now.ToString(); 
     lblDateTime.Refresh(); 
    } 

    private void btnHide_Click(object sender, EventArgs e) 
    { 
     // hide the form rather than closing it 
     this.Hide(); 
    } 
} 

的Program.cs:

static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainForm()); 
    } 
} 

輸出(美預留了這個簡單的例子):

enter image description here

現在,如果你關閉了定時器的形式,然後試圖證明它,這將打破,但你的代碼方案,如果需要重新創建表單(或者不允許在主表單關閉之前關閉表單)。

+0

這是一個醜陋的例子。使用FormClosed事件將變量設置爲空。我認爲這是OP的掛斷。 –

+0

hans pasant這不是我的掛斷,但Jason Down的例子,雖然不是我期待的語言,但確實澄清了我的困惑。 – ThN