1

自从我开始为 .NET 阅读和使用各种语言编写程序以来,有人告诉我,您的程序中的任何内容的“全局”都是非常非常糟糕的。整个想法对我来说似乎没有任何意义。在过去的 10 到 13 年里,我一直是一名程序员/软件开发人员,我开始接受这样一个事实,即作为一名程序员,有时你不能只编写代码而不使用全局对象或变量。

全局变量或对象确实会导致程序中的错误,但这并不意味着它是由于编程语言或编译器本身,而是程序员本人。

就全局窗口表单而言,当您无法将表单实例作为参数传递时,您如何期望能够以编程方式从程序的其他部分更改“SAME”窗口表单属性? . 如果窗口窗体不是全局窗体,则每次程序需要显示或更改其属性时,都必须在本地实例化一个新窗体,但是新窗体将与您打开的第一个窗体不同。如果表单在 private、protected 或 public 部分下的类中声明,则需要实例化该类,然后需要实例化表单本身并在需要的地方传递。我相信你会在这样做时遇到其他一些编程问题。

我什至不知道他们为什么会改变 CLOSE 方法的真正定义。关闭意味着关闭而不是处置。

我并不是要贬低 Global 不好的整个想法。我只是想了解为什么以及以何种方式。

有人可以解释并给我一个示例,说明如何在没有单个“全球”窗口形式甚至变量的情况下完全编程?假设一个程序有两个窗口窗体。一个是主窗体,另一个窗体有一个 Ttimer 和一个标签。主窗体有一个 Tbutton 和单击事件,可打开第二个窗体。第二种形式 Timer 有一个 Tick 事件,每秒将当前日期和时间设置为其标签文本属性。当您单击 TButton 时,它应该打开第二个窗体并每秒显示当前日期和时间。现在向我展示我在 C# 或 Delphi XE 或 prism 或 C++ 或 VB 中描述的上述程序的代码,没有任何全局变量(S)。

谢谢,

4

1 回答 1

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();
    }
}

程序.cs:

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

输出(这个快速示例的美丽除外):

在此处输入图像描述

现在,如果您关闭计时器表单然后尝试显示它,这将中断,但是您将为该场景编写代码,如果需要重新创建表单(或者在主表单关闭之前不允许关闭表单)。

于 2011-08-04T14:43:55.210 回答