5

同じ機能を果たしているが、状態が異なる2つのボタンがあります。コードはこのようなものです。

private void button1_Click(){
// do function1

if(condition){
    ...decrement an integer
    //do function2
}
}


private void button2_Click(){
// do function1

if(another condition){
    ...increment an integer

    //do function2
}
}

condition1とcondition2を渡して、メソッドにインクリメント、デクリメントできますか?

4

5 に答える 5

5

はい、できます。しかし、あなたができることはまだ限られています。このことを考慮

public void Foo(Action action, Func<Boolean> someCondition) {
    if (someCondition() == true) action();
}
于 2012-04-18T06:26:53.253 に答える
1

重複したコードをメソッドに抽出しないのはなぜですか?

private void Function1() 
{ 
   // do function1
}

private void Function2()
{
   // do function2
}

private void button1_Click()
{
   Function1() ;

   if(condition)
   {
       //...decrement an integer
       Function2();
   }
}

private void button2_Click()
{
  Function1();

  if(another condition)
  {
    //...increment an integer
    Function2();
  }
}

同じ構造の類似したメソッドが多数ある場合は、作成を検討してください

private void DoSomething(Func<bool> condition, Action action)
{
    Function1();
    if (condition())
    {
        action();
        Function2();
    }
}

そして、次のように呼び出します。

private int value;

private void button2_Click()
{
    DoSomething(() => value < 5, () => value++);
}

もちろん、条件やアクションにいくつかのパラメーターを渡す必要がある場合は、変更FuncまたはAction入力する必要があります。また、アクションから何らかの値を返す必要がある場合は、Funcの代わりに使用します。Action

private int value;

private void button2_Click()
{
    DoSomething((x) => x % 2 == 0, (x) =>  x.ToString());
}

private void DoSomething(Func<int, bool> condition, Func<int, string> action)
{
    Function1();
    if (condition(value))
    {
        string result = action(value);
        Function2();
    }
}

条件とアクションがそれほど単純でない場合は、ラムダの代わりに名前付きメソッドを使用してください。

private bool FooCondition(int x)
{
   // complex condition here
}

private string BarAction(int x)
{
    // complex action here
}

private void button2_Click()
{
    DoSomething(FooCondition, BarAction);
}
于 2012-04-18T06:26:12.070 に答える
1

次のようなことを試すことができます:

    private void buttonClick()
    {
        DoSomething(condition ? true : false);
    }
    private void DoSomething(bool increment)
    {
        // do stuff

        if (increment)
            ++index;
        else
            --index;
    }
于 2012-04-18T06:23:22.047 に答える
0

.NET 3.0を使用している場合は、Funcをメソッドに渡すことができます。パラメータを受け取り、パラメータを持たない両方のクラスが存在します。ブール値とパラメーターを返す場合は、次のFuncようなラムダを使用して記述できます。

condition => {
  if (condition)
    index++;
  else
    index--;
}

Func変数に保存して、必要に応じて渡すことができます。

于 2012-04-18T06:26:34.603 に答える
0

これは、条件 1 と条件 2 をメソッドにラップし、それらをデリゲートとして使用することで実現できます。これにより、メソッドに渡すことができます。

たとえば、x 個の入力を受け取り、ブール値を返すメソッドを期待するデリゲート シグネチャを含むメッセージを作成できます。次に、条件 1 と 2 の両方でその署名に一致するメソッドを作成し、適切なものをメソッドに渡します。

メソッド内では、デリゲートをメソッドであるかのように呼び出すだけです (実際にはそうです)。

デリゲートに関する Microsoft のドキュメントを確認してください: http://msdn.microsoft.com/en-us/library/ms173171(v=vs.80).aspx

于 2012-04-18T06:17:03.773 に答える