1

.NET用にさまざまな言語で読み上げてプログラミングを始めて以来、プログラム内の「グローバル」は非常に悪いと言われています。その全体の考えは私にはまったく意味をなさないようです。過去10〜13年間プログラマー/ソフトウェア開発者であった私は、プログラマーとしてのあなたがグローバルオブジェクトまたは変数を使用せずにコーディングすることができない場合があるという事実を受け入れるようになりました。

グローバル変数またはオブジェクトがプログラムのバグにつながる可能性があることは事実ですが、それはプログラミング言語またはコンパイラ自体によるものではなく、プログラマ自身によるものであることを意味します。

グローバルウィンドウフォームに関する限り、フォームのインスタンスをパラメーターとして渡すことができない場合、イベント内でプログラムの他の部分から「SAME」ウィンドウフォームのプロパティをプログラムで変更できるとどのように期待しますか。 。ウィンドウフォームがグローバルでない場合、プログラムがそのプロパティを表示または変更する必要があるたびに、新しいフォームをローカルでインスタンス化する必要がありますが、新しいフォームは最初に開いたフォームと同じにはなりません。フォームがprivate、protected、またはpublicセクションのクラス内で宣言されている場合は、クラスをインスタンス化する必要があります。次に、フォーム自体をインスタンス化して、必要な場所に渡す必要があります。そうすることで、他のプログラミングの問題に遭遇すると確信しています。

なぜ彼らがCLOSEメソッドの本当の定義を変えるのかさえ私にはわかりません。クローズとは、破棄せずにクローズすることを意味します。

私はグローバルが悪いという考え全体を否定しようとはしていません。なぜ、どのように理解しようとしているだけです。

誰かが説明して、単一の「グローバル」ウィンドウフォームや変数さえも使わずに完全にプログラムする方法の例を教えてもらえますか?プログラムに2つのウィンドウ形式があるとしましょう。1つはメインフォームで、もう1つはTtimerとラベルがあります。メインフォームには、2番目のフォームを開くTbuttonおよびclickイベントがあります。2番目の形式のタイマーには、現在の日付と時刻をそのラベルテキストプロパティに毎秒設定するTickイベントがあります。TButtonをクリックすると、2番目のフォームが開き、現在の日付と時刻が1秒ごとに表示されます。次に、C#、Delphi XE、プリズム、C ++、VBで説明した上記のプログラムのコードを、グローバル変数なしで表示します。

ありがとう、

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

Program.cs:

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

出力(この簡単な例は別として):

ここに画像の説明を入力してください

タイマーフォームを閉じてから表示しようとすると、これは壊れますが、そのシナリオのコードを作成し、必要に応じてフォームを再作成します(または、メインフォームが閉じるまでフォームを閉じないようにします)。

于 2011-08-04T14:43:55.210 に答える