C# - 使用重载有什么好处?

时间:2012-08-11 10:11:13

标签: c# overloading

重载方法真的有什么重大优势吗?

让我们考虑以下示例:

class SillyMath
{
    public static int Plus(int number1, int number2)
    {
        return Plus(number1, number2, 0);
    }

    public static int Plus(int number1, int number2, int number3)
    {
        return Plus(number1, number2, number3, 0);
    }

    public static int Plus(int number1, int number2, int number3, int number4)
    {
        return number1 + number2 + number3 + number4;
    }
}

使用默认值的参数不是更容易吗?

public static int Plus(int number1, int number2, int number3 = 0, int number4 = 0)
        {
            return number1 + number2 + number3 + number4;
        }

1。那么有谁能告诉我为什么在编程时我会考虑重载?

2。如果我需要引入一些条件语句怎么办?超载是否仍然具有相关性?

编辑:此外,同时我了解到重载也可以有不同的返回类型。在我看来,这是值得考虑的重载。

3 个答案:

答案 0 :(得分:3)

过载存在很久之前C#中存在默认值参数,但

  

所以有人可以告诉我为什么在编程时会考虑重载?

如果参数的多样性往往很大(我是一个主观的,但会说多于5个),最好使用overload,因为它更容易阅读码。

  

如果我需要引入一些条件语句怎么办?超载是否仍然具有相关性?

不要真的得到你要求的东西,但我假设,你的意思是根据不同的参数值抛出异常。

这是一个非常好的例子,最好使用重载,在每个重载函数中本地化决策逻辑,而不是在一个大单一方法中if/elseif/elseswitch/case

希望这有帮助。

修改

关于number3的最新评论。

我会考虑这样的事情:

///
///<int number3>A number for something not more then default value </int number3> //COMMENT
public void function(int number3Maximum = 100) //MAKE ESPLICIT EXPECTED MAXIMUM VALUE
{
   if(number3Maximum >100)
       throw new ArgumentOutOfRangeException("number3Maximum can not be more then default maximum"); 

     ..... //CODE
}

答案 1 :(得分:3)

一个原因可能是制作看似单一的方法,它采用各种不同的输入。例如,BinaryWriter.Write具有以下重载(以及其他几个):

Write(Boolean)
Write(Byte) 
Write(Byte[])   
Write(Char) 
Write(Char[])   
Write(Decimal)  
Write(Double)   
Write(Int16)    
Write(Int32)    
Write(Int64)    
Write(SByte)    
Write(Single)   
Write(String)   
Write(UInt16)   
Write(UInt32)   
Write(UInt64)

允许您编写如下代码:

bool   value1 = true;
int    value2 = 5;
double value3 = 5.5;
byte   value4 = 1;

using (BinaryWriter writer = GetABinaryWriter())
{
   writer.Write(value1);
   writer.Write(value2);
   writer.Write(value3);
   writer.Write(value4);
}

答案 2 :(得分:1)

我更愿意用您的语言解释

class SillyMath
    {
        public static int Plus(int number1, int number2)
        {
            return Plus(number1, number2, 0);
        }

        public static int Plus(int number1, int number2, int number3)
        {
            return Plus(number1, number2, number3, 0);
        }

        public static int Plus(int number1, int number2, int number3, int number4)
        {
            return number1 + number2 + number3 + number4;
        }
    }

现在假设有两个用户A和B;

  

A的要求是添加两个数字43&amp; 45

     

B的要求是增加三个数字123,98&amp; 63

如果我们使用两个争论函数,即int

Plus(int number1, int number2)

然后B一直在编写像Plus(123,Plus(98,63));

这样的代码

同样对于三个论证函数A的代​​码是Plus(43,45,0);

现在,从某些角度来看,您可以看到两个代码看起来都很脏。 因此,有时为了方便程序员实现重载功能,这会为任务增加额外的自定义功能。

一个例子

  MessageBox.Show("You must enter a name.", "Name Entry Error",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

您可以使用不带"Name Entry Error",MessageBoxButtons.OK,MessageBoxIcon.Exclamation的MessageBox,只有您会错过的是自定义,并且会以默认形式出现。