3

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

让我们考虑以下示例:

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. 如果我需要输入一些条件语句怎么办?重载仍然相关吗?

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

4

3 回答 3

4

一个原因可能是制作一个看似单一的方法,该方法接受各种不同的输入。例如,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);
}
于 2012-08-11T11:23:48.893 回答
3

在具有默认值的参数出现之前,重载就存在很多C#,但是

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

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

如果我需要输入一些条件语句怎么办?重载仍然相关吗?

并没有真正得到你想要的,但我,你的意思是根据不同的参数值抛出异常。

这是一个非常好的例子,最好使用重载,在每个重载函数中本地化决策逻辑,而不是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
}
于 2012-08-11T10:15:41.917 回答
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 和 45

B的要求是添加三个数字123、98和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);

您可以使用 MessageBox,而
"Name Entry Error",MessageBoxButtons.OK,MessageBoxIcon.Exclamation您唯一会错过的就是自定义,并且事情将以默认形式出现。

于 2012-08-11T10:29:14.030 回答