编程语言
首页 > 编程语言> > 在C#中同时具有特定参数和params方法重载的好处

在C#中同时具有特定参数和params方法重载的好处

作者:互联网

.NET框架中有许多示例,其中一个方法有多个重载,其中一些重载使用特定数量的参数,然后使用params关键字进行最终的“全部捕获”.常见的示例在String类上,例如:

> String.Format()
> String.Concat()

我想知道为什么有这么多方法重载的特殊原因吗?起初,我认为这可能与性能有关.这样的问题及其答案-Cost of using params in C#的答案就是这样.

但是,我开始使用Reference Source网站来研究.NET源代码.我在String class source code中注意到了这一点:

String.Concat()实际上运行不同的代码,具体取决于使用了多少固定参数-我认为这绝对是一种优化.但是String.Format()似乎只是为主要param方法提供了包装器-参见下面的释义代码:

public static String Format(String format, Object arg0)
{
    return Format(format, new Object[] { arg0 });
}

public static String Format(String format, Object arg0, Object arg1)
{
    return Format(format, new Object[] { arg0, arg1 });
}

public static String Format(String format, Object arg0, Object arg1, Object arg2)
{
    return Format(format, new Object[] { arg0, arg1, arg2 });
}

public static String Format(String format, params Object[] args)
{
    // Do work here...
}

那么,是否存在性能优势?或者仅仅是为了方便起见,还是两者兼而有之?在上面的特殊情况下,我看不到任何明显的好处,而且似乎只是重复工作.

解决方法:

更新:不是String.Concat,而是String.Format.

我想这背后的原因是所有调用最终都在StringBuilder.AppendFormat中结束,这很复杂,如果您以不同的方式处理每个输入参数,它将是代码重复的主要来源.

如果您使用重型API(例如跟踪),则情况会有所不同,在这种API中,通过参数重载调用方法的开销非常大.最高可达5倍.
对于LINQ常见的隐式委托分配也是如此.这些临时委托实例在优化代码中并不便宜.例如,罗斯林(Roslyn)禁止使用LINQ,因为隐式委托分配成本很高.

标签:overloading,c,net,params-keyword
来源: https://codeday.me/bug/20191121/2050735.html