繁体   English   中英

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

[英]Benefits of having both specific arguments and params method overloads in C#

.NET框架中有许多示例,其中有一个方法有多个重载,其中一些使用特定数量的参数,后跟最后的“catch all”,其中使用了params关键字。 这个例子的常见例子是String类,例如:

我想知道为什么有这么多这些方法重载的特殊原因? 起初我认为这可能与表现有关; 这个问题的问题和答案 - 在C#中使用params的成本 - 就是这样的。

但是,我开始使用Reference Source网站深入研究.NET源代码。 我在String类源代码中注意到了这一点:

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

那么有性能优势还是仅仅是方便的问题,或者两者兼而有之? 在上面的特定情况下,我没有看到任何明显的好处,它似乎只是重复工作。

它允许您创建调用该方法的每个签名的委托:

Func<string, object, object> foo = string.Format;

这不适用于params方法; 您只能将该重载分配给Func<string, object[]>或在其签名中专门提供params的委托。 您将被迫创建一个新方法,该方法只调用params重载来创建一个在他的示例中使用的签名的委托(可能通过使用lambda)。

更新:它不是String.Concat而是String.Format。

我想这背后的原因是所有调用都以StringBuilder.AppendFormat结束,这非常复杂,如果你以不同的方式处理每一个输入参数,它将成为代码重复的主要来源。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM