1

所以我读过这篇文章C# Overloads说你可以使用重载方法来消除复杂性并提高性能,它们提供了以下示例:

使用系统;

class Program
{
    public static void Main()
    {
    ShowString(string.Empty);
    ShowString("Category");
    }

    static void ShowString(string value)
    {
    if (value == string.Empty)
    {
        Console.WriteLine("Popular");
    }
    else
    {
        Console.WriteLine(value);
    }
    }
}

然后他们使用重载重写:

using System;

class Program
{
    public static void Main()
    {
    ShowString();
    ShowString("Category");
    }

    static void ShowString()
    {
    // Send default argument to overload.
    ShowString("Popular");
    }

    static void ShowString(string value)
    {
    // We don't need an if check here, which makes
    // ... calling this method directly faster.
    Console.WriteLine(value);
    }
}

使用重载变体会比使用具有默认参数值的方法提供更好的性能结果吗?

像:

using System;

class Program
{
    public static void Main()
    {
    ShowString();
    ShowString("Category");
    }

    static void ShowString(string value = "Popular")
    {
    // We don't need an if check here, which makes
    // ... calling this method directly faster.
    Console.WriteLine(value);
    }
}

还是最后一段代码等同于第一段代码?

4

2 回答 2

2

重载不一定与性能有关。在这种情况下,差异很小;无参数版本是:

call, ldstr, call

带参数的版本是(包括默认参数版本,不管是否指定值):

ldstr, call, ldarg_0, call

但是,这不会影响性能;这里唯一与性能相关的是调用控制台,这比其他任何事情都要慢得多

Aka:除非您认为存在实际问题,否则请不要担心。

当特定方法允许优化版本时,重载更有用,例如删除装箱。

于 2012-08-11T12:24:18.963 回答
2

不,默认参数至少与重载一样快,因为您的最后一个示例编译为:

....
ShowString("Popular");
ShowString("Category");
....

您的第二个示例(使用重载)(如果为 Release 而不是 Debug 构建)可能会在运行时内联,以便性能与上一个示例(默认参数)相同。

这个例子有点傻,因为成本value == string.Empty几乎没有,但我想它可以说明这一点。但是,这可能是您应该从这个答案中得到的最重要的一点:在过早优化之前,您应该始终使用更清晰/更可维护的代码,因此可用性应该是确定在给定情况下应该使用什么的最重要因素。

于 2012-08-11T12:24:26.977 回答