-1

パブリック(静的ではない)変数「Var」で何らかの処理を行うFormXという名前のフォームを開くと。「Var」は呼び出しフォームから設定され、処理されて出力用に返されます。実行中に複数のフォームから複数回開きます。すべてのフォームが同時に実行されます。各 FormX は、親フォームからのオブジェクトの個別のインスタンスを使用して開かれるため、正常に機能します。しかし、私のプロジェクトには、すべてのフォームにアクセスできる public static クラス "Abc" があり、コードを追加すると:

public static class Abc
{
  public static string Open_form(string Var)
  {
    FormX Obj = new FormX();
    Obj.Var = Var;
    Obj.Show();
    Obj.Process_Var();
    Var = Obj.Var;
    Obj.Close();
    return Var;
  }
}

次のように、フォームのどこかで(そして複数回)呼び出します。

Form1_Load()
{
  //Some operations
  MessageBox.Show(Abc.Open_form("ABC"));

  //Some operations
  MessageBox.Show(Abc.Open_form("XYZ"));
}

Form2_Load()
{
  //Some operations
  MessageBox.Show(Abc.Open_form("123"));

  //Some operations
  MessageBox.Show(Abc.Open_form("456"));
}

Form1 と Form2 は、メイン フォームから次のように開かれます。

Form1 obj1 = new Form1();
obj1.Show();

Form2 obj2 = new Form2();
obj2.Show();

それで何か問題が発生するでしょうか?2つのフォームが同時に静的呼び出しを呼び出した場合、変数「Var」の処理に問題はありますか? もう 1 つ質問があります。Why と Why not のFormX.Dispose();後に電話する必要がありますか? FormX.Close();の利点はありFormX.Dispose()ますか?

4

2 に答える 2

2

FormX.Varがプロパティまたはフィールドの場合static、はい。複数のスレッドまたはオブジェクトで同時に使用すると問題が発生する可能性があります。そうFormX.Varでない場合はstatic、いいえ、問題はないはずです。

経験則:Disposeを実装するすべてのオブジェクトを常に呼び出しますIDisposable。GC にはこれを呼び出す手段がありますが、常に自分で呼び出すことをお勧めします。これを容易にするために、C# のusingキーワードを使用します。以下の構文は、自動的に を呼び出しますDispose

using (FormX Obj = new FormX())
{
    ...
}

Close直接電話する必要はほとんどありません。コードを見ると、FormX をモーダルフォームとして表示したいようです。つまり、ユーザーにフォームを操作してもらい、完了したら [OK] ボタンを押してもらいます。次に、Varプロパティの値を読み取って、ユーザーが入力した情報を取得します。ShowDialogこのシナリオでは、代わりにを呼び出す必要がありますShow。呼び出しはShowDialog、フォームが閉じられたときにのみ返されます。フォームが既に閉じられているため、後で呼び出しても効果はありませCloseん。ShowDialog

全体として、コードは次のようになるはずです。

    public static string Open_form(string Var)
    {
        using (FormX Obj = new FormX())
        {
            Obj.Var = Var;
            Obj.ShowDialog();
            Obj.Process_Var();
            return Obj.Var;
        }
    }
于 2013-06-17T15:01:23.420 に答える
1

あなたの投稿には、「マルチスレッド」を示すものも、フォームが「同時に実行されている」こともありません。したがって、あなたのFormX.Var価値は問題ありません。

于 2013-06-17T15:10:40.593 に答える