【问题标题】:Several overloads for method with "params" keyword带有“params”关键字的方法的几个重载
【发布时间】:2012-12-26 10:08:37
【问题描述】:

我查看了Path.Combine 并注意到它有四个重载:

  1. string, string
  2. string, string, string
  3. string, string, string, string
  4. params string[]

前三个重载有什么用处?
在我看来,第四个重载使其他重载毫无意义。我查看了源代码,确实发现第四个重载的实现有点不同,但即使在这种情况下,我也希望只有一个 params 重载,它根据数组的长度决定使用哪个实现。

【问题讨论】:

  • 好吧,Combine(String, String) 是为了向后兼容(4 之前的版本没有任何其他重载)。
  • 据我了解,非参数重载允许您跳过创建参数数组和参数迭代器的开销。不过,我不记得我在哪里读到的,所以我是在评论而不是回答。
  • @phoog - 这是有道理的。大多数用途需要组合多达 4 个路径部分。
  • @Oded 实际上,我说的是 params 方法,它们看似不必要地重载了 1、2 和 3 个参数。这是同样的问题,但询问了 string.Format:stackoverflow.com/questions/2796731/…

标签: c# .net overloading params-keyword


【解决方案1】:

根据这个答案https://stackoverflow.com/a/2796763/385844,这是为了避免创建参数数组的开销,并且因为非参数重载对于不支持可变长度参数列表的语言的用户来说很方便。

另见

Why does string.Format come in several flavors?

【讨论】:

    【解决方案2】:

    正如 Oded 所说,我发现它一定是为了向后兼容,因为我在 2.0、3.5 中找不到它

    我认为重载始于 4.0

    至于其他许多重载,我不会代表 .net 团队发言,但我觉得他们觉得每次增加重载都是没有意义的,所以他们停在 4 处并为超过 4 个字符串组合提供了一个字符串数组 -我认为是明智的

    我的解释基于团队在 16 个参数处停止的 Lambda 表达式

    Action(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16)

    Path.Combine 本来可以这样,但毫无意义。

    【讨论】:

    • 是的,但它没有解释 3 和 4 字符串重载(特别是因为同时添加了 params 数组重载)。
    • Action 的东西不同,目前还没有params 的泛型定义。
    【解决方案3】:

    我只能从我与其他 C# 开发人员的经验谈起。

    并非所有开发人员都熟悉或熟悉params 语法(技术名称是可变参数函数这一事实并没有帮助)。
    我知道我不得不一遍又一遍地解释它,所以看到电话并不罕见

    instance.ParamsMethod(new int[]{1});
    //or even
    instance.ParamsMethod(new List<int>{1}.ToArray());
    

    对于写成这样的方法:

    public void ParamsMethod(params int[] source) {}

    否定params 的所有甜美语法糖(然后是一些)。

    所以,我个人的偏好是将 1 和 2 参数的情况作为重载提供,因为这在一定程度上使得不必要地混乱代码变得更加困难。由于重载链接,调用速度稍慢,但它有助于使代码更清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      相关资源
      最近更新 更多