1

たとえば、引数のために MethodOne を呼び出すメソッドがあるとします。

public void MethodOne()
    {
      //do stuff. 
    }

ここで、オプションの peramater を作成したいとしましょう。たとえば、別のオーバーロードを取る同じ名前の別のメソッドを作成することを決定する場合があります。

public void MethodOne()
    {
       //do stuff.
    }

public void MethodOne(bool checkVar)
    {
       if(checkVar)
        {
           //do stuff
        }
       else
        {
          //do other stuff
        }
    }

これで、2 つの異なるオーバーロードの組み合わせ (?) を持つメソッドができました。これは、実際には、1 つのメソッドを持つよりも優れており、オプションのオーバーロードが null であるか、情報が含まれているかどうかを確認するだけです。

 public void MethodOne(int? testVar)
     {
        if(testVar != null)
         { 
           //do stuff
         }
     }

これは 1 つのオーバーロードだけでは些細なことのように思えるかもしれませんが、通過させたい 5 つの変数があると想像してください。5 つのメソッドを作成し、同じ名前で異なるオーバーロードを使用するか、または 1 つのメソッドだけを作成して、渡された変数をチェックしますか?

4

4 に答える 4

4

これにはいくつかの回避策があります。たとえば、列挙子とオブジェクト配列を2番目のパラメーターとして使用して、実際のパラメーター値を含めることができます。これにより、列挙子を切り替えてデータを処理する方法を知ることができます。または、5つのオブジェクトパラメーターを宣言してから、それらをチェックすることもできます。スイッチを入力し、それに応じてボックスに入れて続行します。しかし、どちらのオプションも非常に悪い習慣です。

さまざまなオーバーロードに固執することをお勧めします。

public void MethodOne(Boolean value)
{
    // Process the value...
}

public void MethodOne(Int32 value)
{
    // Process the value...
}

public void MethodOne(Int32 value, String text)
{
    // Process the value and the text...
}

// And so on...

または、パラメータ宣言のデフォルトデータ:

public void MethodOne(Int32 integer = 1, String text = "hello", ...)
{
    // Process everything inside the method...
}

またはパラメータ化されたメソッド(すべてのオブジェクトタイプに共通の処理がある場合):

public void MethodOne(params Object[] parameters)
{
    for (int i = 0; i < parameters.Length; ++i)
        // Check type of parameter and process the value...
}

または、設計で許可されている場合にバブリングするメソッド(最初のメソッドはコードの冗長性を大量に生成し、2番目のメソッドはあなたやあなたと一緒に作業している他の開発者を混乱させる可能性があるため、これは私のお気に入りです):

public void MethodOne(Int32 value)
{
    MethodOne(value, "hello");
}

public void MethodOne(Int32 value, String text)
{
    // Process everything inside the method...
}
于 2013-01-14T14:58:23.883 に答える
3

あなたができることは、オプションの引数を使用することです:

 public void MethodOne(int testVar = 0)
 {
     if(testVar != 0)
     { 
       //do stuff
     }
 }
于 2013-01-14T14:57:53.493 に答える
2

引数の数が増えるにつれて、メソッドのネストされたif / elseロジックを調べて、使用されている引数を判別したくありません。読み、理解し、維持するのは難しく、バグにつながる可能性があります。オーバーロードを使用して、メソッドを簡潔、無駄のない、保守しやすい状態に保ちます。

于 2013-01-14T15:04:31.517 に答える
2

通常、次のようなオーバーロードでバブルダウンします。

public void MethodOne()
{
    MethodOne(1)
}
public void MethodOne(int testVar)
{
    MethodOne(testVar, "test")
}
public void MethodOne(int testVar, string testString)
{
    MethodOne(testVar, testString, null)
}
public void MethodOne(int testVar, string testString, object testObject)
{
    // Do your actual code here
}

これは、

public void MethodOne(int testVar = 1, string testString = "test", object testObject = null)
{
    // Do your actual code here
}

ただし、通常は、既定のパラメーターよりもオーバーロードを避ける必要があります。また、私の例のように「バブルダウン」することで、冗長なコードや冗長な「デフォルトパラメーター」を避けることができます

于 2013-01-14T14:59:23.860 に答える