1

ユーザーフォーム変数をクラスに渡す方法がよくわからないという問題がよく発生します。たとえば、私はボタンを持っています:

private void button1_Click(object sender, EventArgs e)
{
    DoStuff();
}

およびフォームクラスのメソッド:

DoStuff()
{

    Class123 myclass = new Class123();

}


...
...

class Class123
{

    //how do i pass for example in myotherClass whether or not my checkbox on the userform is checked? i dont want to have to pass from method to method to class to class. what is the logical/smart way of handling this?
    ClassData myotherClass = new ClassData();
}

ユーザーフォームのチェックボックスがオンになっているかどうかに関係なく、たとえばmyotherClassに渡すにはどうすればよいですか?メソッドからメソッドへ、クラスからクラスへと渡す必要はありません。これを処理する論理的/スマートな方法は何ですか?

4

3 に答える 3

3

関数の引数を探していると思います:

// notice the declared function argument isMyCheckboxChecked
DoStuff(bool isMyCheckboxChecked)
{
    Class123 myclass = new Class123(isMyCheckboxChecked);

}

private void button1_Click(object sender, EventArgs e)
{
    // passing the state of the checkbox to DoStuff as an argument
    DoStuff(chkMyCheckbox.Checked);
}


class Class123
{
     readonly ClassData myotherClass = new ClassData();

     Class123(bool isMyCheckboxChecked) 
     { 
          myOtherClass.isMyCheckboxChecked = isMyCheckboxChecked;
     }
}
于 2012-04-05T23:12:11.987 に答える
2

ここでいくつかのことがわかります。投稿されたコードはかなりあいまいなので、正しい答えが何であるかを言うのは難しい.

  1. チェックボックスが変更されたときにチェックボックスがオンになっているかどうかを myOtherClass が知る必要がある場合は、おそらくサブスクライバー パターンの使用を検討する必要があります。

  2. ただし、 DoStuff() が実行された時点でチェックボックスがオンになっていたかどうかを知りたいだけなら、変数を渡すことに何の問題もありません。実際、変数を渡すのが好ましい方法です。変数が存在するのはそのためです。とはいえ、変数を賢く渡す必要があります。クラス間でパラメーターを常にスリングしているだけであることがわかった場合、それはコードの設計が不十分であることを示しています。何をすべきかを伝えるためにいくつかのパラメーターを myClass に渡す必要がある場合は、それらを独自の (わかりやすい名前の) クラスに構築し、そのクラスをパラメーターの長いリストの代わりに myClass のコンストラクターに渡します。

于 2012-04-05T23:15:49.820 に答える
1

私はこのアプローチに同意しません。
「賢い」方法は、たとえ存在したとしても、オブジェクト指向プログラミングの黄金律を破るでしょう。オブジェクトは、制御された方法でのみアクセスまたは変更できる自己完結型のデータ項目です。これにより、データがグローバルにアクセスできる手続き型コードでよくある問題である副作用が防止されます。OOP では、オブジェクトは、メソッドを呼び出すことによってのみ、他のオブジェクトとメッセージを送受信できます。

編集:それを行う方法を示すには

public static class MyApp
{
    public static bool MyCheckBox {get; set;}
}

あなたのdoStuffで

MyApp.MyCheckBox = this.checkBox1.Checked;

myOtherClass のメソッド内

   if(MyApp.MyCheckBox == true)
   ...

これは、昔の手続き型言語でグローバル変数を使用するのと同じです。これにより、バグの追跡が困難になり、アプリケーションの保守が困難な状態モードが作成されます

于 2012-04-05T22:55:43.813 に答える