在 .NET 框架中有许多示例,其中有多个重载方法,其中一些使用特定数量的参数,然后是最终的“全部捕获”,其中 params
使用关键字。这方面的常见示例在 String
类中,例如:
我想知道为什么有这么多方法重载是不是有什么特别的原因?起初我认为这可能与性能有关;这个 SO 问题的问题和答案 - 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...
}
那么这是否有性能优势,或者这仅仅是为了方便,还是两者兼而有之?在上面的特殊情况下,我没有看到任何明显的好处,它似乎只是在重复工作。
最佳答案
它允许您为调用该方法的每个签名创建委托(delegate):
Func<string, object, object> foo = string.Format;
这不适用于 params
方法;您只能将该重载分配给 Func<string, object[]>
或专门提供 params
的代表在其签名中。您将被迫创建一个新方法,该方法仅调用 params 重载来创建示例中使用的签名委托(delegate)(可能通过使用 lambda)。
关于c# - 在 C# 中同时具有特定参数和参数方法重载的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25689475/