最佳实践:创建方法,不同的重载

时间:2013-01-14 14:52:10

标签: c# methods

比方说,我们有一个方法,为了论证,我们将调用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个方法,同名具有不同的重载,或只是一个方法并检查传递的变量?< / p>

4 个答案:

答案 0 :(得分: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...
}

答案 1 :(得分:3)

您可以使用optional arguments

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

答案 2 :(得分: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
}

但通常你应该优先于默认参数的重载。此外,通过像我的示例中那样“冒泡”,您可以避免使用冗余代码或冗余的“默认参数”

答案 3 :(得分:2)

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