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

标签 c# .net overloading params-keyword

在 .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/

相关文章:

c# - Hashtable 的内存是如何分配的?

.net - vb.net 重新绑定(bind)数据网格以显示 vb.net 中的更改

parameters - 具有可选参数的冲突重载方法

c# - 三角函数调车场算法

c# - 秒表是否有运行的最长时间?

c# - 热逻辑比较 bool 数组与它自己的单个 bool 结果?

php检查方法是否在子类中被覆盖

c++ - 在派生类中重写二进制运算符

c# - 在 .NET Core 中引用时,从程序集文件加载的类型不等于同一类型

c# - 当我们可以在 ArrayList 中存储东西(值和引用)时,为什么还要使用泛型?