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
        }
    }

所以现在我们有了一个方法,它有两种不同的重载组合(?)。在实践中,这是否比使用一种方法更好,例如仅检查可选重载是否为空或包含信息;

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

这可能看起来微不足道,只有一个重载,但想象一下我有 5 个要传递的变量,我会创建 5 个方法,不同重载的同名方法,还是只有一个方法并检查传递的变量?

4

4 回答 4

4

有一些解决方法。例如,您可以使用一个枚举器和一个 Object 数组作为包含实际参数值的第二个参数,这样您就可以通过切换枚举器来知道如何处理数据……或者您可以只声明 5 个 Object 参数,然后检查它们的输入一个开关,将它们相应地装箱并继续。但这两种选择都是非常糟糕的做法。

我建议你坚持不同的重载:

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...
}

或者,如果您的设计允许,方法会冒泡(这是我最喜欢的方法,因为第一个方法只会产生大量代码冗余,而第二个方法有时可能会让您或与您一起工作的其他开发人员感到困惑):

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

您通常会在这样的重载上冒泡:

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 回答
2

随着参数数量的增加,我不想查看方法的嵌套 if/else 逻辑来确定正在使用哪些参数。它很难阅读、理解、维护并且可能导致错误。使用重载并保持你的方法简洁、精益和可维护。

于 2013-01-14T15:04:31.517 回答