TOC

This article is currently in the process of being translated into Chinese (~85% done).

类 :

Method overloading

很多编程语言都支持默认/可选参数。这让程序员可以通过给一个或多个参数赋默认值来把参数变成可选参数。这个做法在给现有代码增加功能时尤其有用。

例如,你可能想给一个现有的方法增加功能,需要增加一两个参数。而这样做就会破坏那些调用此方法的现有代码,因为那些代码传递的参数数量就不再正确了。要绕开此问题,就得把新增加的参数定义为可选的,给其赋上默认值,以对应在增加这些参数前方法的运行方式。

可选参数是在C# 4.0版本中引用的,在此之前,C#程序员们只能使用另一种技术,基本上做的是同样的事,叫做方法重载。这种技术让程序员可以定义几个同名的方法,这些同名方法的参数必需不同。只要你用过.NET framwork,就能很快意识到方法重载随处可见。String类的Substring()方法就是个很好的例子,就有一个的重载,象这样:

string Substring (int startIndex)
string Substring (int startIndex, int length)

可以使用一个或两个参数调用此方法。如果只用一个参数来调用,则length参数会被推定为之后全部字符的长度,如果调用方只简单想获得字串的后半部份,这个重载方法就给我们省下多传递一个参数的时间了。

那么,同样的方法定义了多个版本,怎样避免在不同的地方重复同样的代码呢?其实很简单:让此方法的简单版本去调用其复杂版本来完成全部工作。请看如下示例:

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 number1 + number2 + number3;
    }
}

我们定义了Plus方法的两个版本。第一个版本有两个参数,用来求两个数字之和,而第二个版本有三个参数。实际的功能都在有三个参数的版本中实现 - 如果只想求两个数字之和,就让第一个版本去调用三个参数的版本,简单地使用0作为第三个参数即可,就象是一个默认参数一样。当然,当然,是个很傻的例子,类名称就已经告诉你了,不过应该能说明其工作原理了。

然后,如果你还想做个四个数字相加的高级计算(开个玩笑),简单,只需再增加一个重载就行了:

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

这种技术超酷的一点在于所有调用Plus方法的现有代码都不会有问题,不会意识到任何变化。C#用得越多,你应该就越能欣赏方法重载的好处。


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!