自从我开始阅读和编写各种语言的.NET以来,我被告知程序中任何内容的“全局”非常糟糕。整个想法对我来说似乎没有任何意义。在过去的10到13年里,我一直是程序员/软件开发人员,我接受了这样一个事实:有时你作为程序员不能只使用全局对象或变量进行编码。
全局变量或对象确实可以导致程序中的错误,但这并不意味着它是由于编程语言或编译器本身而是程序员自己
就全局窗口表格而言,当您无法传递表单实例时,您希望如何在事件中以编程方式从程序的其他部分更改“SAME”窗口表单属性作为参数。如果窗体不是全局的,那么每当它们的程序需要显示或更改其属性时,必须在本地实例化一个新窗体,但是新窗体将与您打开的第一个窗体不同。如果在私有,受保护或公共部分下的类中声明表单,则需要实例化该类,然后需要实例化表单本身并在需要的地方传递。我相信你会遇到其他一些编程问题。
我甚至不知道为什么他们甚至会改变CLOSE方法的真正定义。关闭意味着关闭不要处置。
我并没有试图说明全球变坏的整个想法。我只是想了解为什么以及以何种方式。
有人可以解释一下如何在没有单一“GLOBAL”窗口形式甚至变量的情况下完全编程的例子吗?假设程序有两种窗体形式。一个是主要形式,另一个形式有Ttimer和标签。主窗体有一个Tbutton和click事件,它打开第二个窗体。第二种形式Timer有一个Tick事件,可以每秒为其标签文本属性设置当前日期和时间。当您单击TButton时,它应该打开第二个表单并每秒显示当前日期和时间。现在向我展示我在C#或Delphi XE或prism或C ++或VB中描述的上述程序的代码,没有任何全局变量(S)。
谢谢,
答案 0 :(得分: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());
}
}
输出(除了这个简单的例子之外的美丽):
现在,如果您关闭计时器表单然后尝试显示它,这会破坏,但您需要为该场景编码,如果需要重新创建表单(或者在主表单关闭之前不允许表单关闭)