【问题标题】:Why does Func and Action Delegates only take 4 arguments?为什么 Func 和 Action Delegates 只接受 4 个参数?
【发布时间】:2010-12-10 06:35:27
【问题描述】:

为什么是 4?我知道它在文档中是 4,​​但这看起来很奇怪。

【问题讨论】:

  • 你能解释一下为什么你需要超过 4 个吗?
  • @Jon Limjap,你能解释一下为什么你需要超过 3 个吗?
  • 即用于构建数学预测模型,根据提供的基因编码将函数解包为委托)
  • 我实际上不需要任何东西。我只是好奇而已。在 .net 框架中发现像这样硬编码和限制的东西很奇怪,我想知道它背后是否有一些逻辑。比“再多一点,你的代码就会有异味。”

标签: c#


【解决方案1】:

我会冒昧地说这是因为有人在框架中的某个地方需要一个带有 4 个参数的 Action 或 Func 委托,而目前还没有人需要一个带有 5 个参数的委托。或者,有人决定不超过 4 个而你正如@chadmyers 所说,应该引入一个类来保存值。

【讨论】:

  • Bravo - 更可能是一个简单的务实选择,未来可能会发生变化,而不是像“如果你需要四个以上,你做错了”这些所谓的原则性答案.
  • 当然,如果您需要 17 个参数,添加自己的 Func 重载也很容易。但是 4 似乎是一个很好的折衷方案,它以最少的额外代码添加到 BCL 来涵盖最常见的用例。
【解决方案2】:

我不知道确切的答案,但我猜这与这样一个事实有关,即如果您使用 >4 个参数传递委托,这是一种代码异味,您可能做错了什么。您应该考虑使用“Introduce Parameter Object”重构。

【讨论】:

    【解决方案3】:

    奇怪的是,人们需要消费四种类型的对象,封装它们,操纵它们,并在一个类中跟踪它们。

    我什至认为,除了三种不同的类型之外,你的泛型类已经走得太远了。通常你必须考虑你的类型如何相互交互的排列,例如,1 类型很好,1 x 2 很好,3 你有 6 种方式来操作你的类型,4 你有 24 种组合可供选择,因此您也应该考虑到这种复杂性。

    【讨论】:

      【解决方案4】:

      在 .NET 4.0 中,您可以获得更多信息 - 最高可达 16 parameters

      虽然常规使用在可读性方面可能有点远...

      【讨论】:

        【解决方案5】:

        首先,我同意其他人的观点,即带有 5 个参数的函数签名可能会有点长。话虽如此,在我作为开发人员的时间里,我已经编写了很多长函数签名。

        您始终可以编写自己的重载泛型委托。你甚至可以将它们放在 System 中(我不会)。

        namespace System
        {
          public delegate void Action<T1, T2, T3, T4, T5>(T1 arg1, T2 arg2, 
                                                          T3 arg3, T4 arg4, T5 arg5);
          public delegate ReturnT Action<ReturnT, T1, T2, T3, T4, T5>(T1 arg1, 
                                                 T2 arg2, T3 arg3, T4 arg4, T5 arg5);
        }
        

        编辑:自从我撰写这篇文章以来,.Net 4. 已经到来,以及这些代表的更长版本。

        【讨论】:

          【解决方案6】:

          因为有这么多参数的委托是一种糟糕的开发模式。 它使您的代码极其耦合和复杂。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-01-14
            • 2014-12-06
            • 1970-01-01
            • 2017-08-11
            • 2015-03-02
            • 2012-01-14
            • 1970-01-01
            相关资源
            最近更新 更多