【问题标题】:use Func<> (or Action<>) or create own delegate?使用 Func<>(或 Action<>)还是创建自己的委托?
【发布时间】:2010-12-16 07:32:24
【问题描述】:

哪一个更好,比如方法中的参数类型(与 LINQ 无关)。 显然 Func 更好,因为它更简单,更具描述性,如果每个人都使用它,一切都会变得兼容(好)。 但是我注意到微软在某些库中使用了自己的委托,例如事件处理程序。那么,它们各自的优缺点是什么?我应该什么时候使用它?

编辑:

  • 显然 Func 仅在 3.5 中可用,因此这可能是我看到非 Func 代表的主要原因。还有其他不使用 Func 的理由吗? (例如:this 来自 .NET4)

  • 同样的问题也适用于 Action

【问题讨论】:

  • 哪些库?可能这些库是在 .Net 3.5 之前开发的(尤其是 EventHandler)
  • 主要在事件处理程序中,但我也在其他库中看到它,我会尝试回忆
  • Func&lt;&gt; 直到 .net 3.5 才存在。之前的大多数事件处理程序。
  • @Louis Rhys:Reflector .NET 将所有代表(包括 Func)“渲染”为delegate。也许你在那里看到了。
  • 嗯,这是有道理的。不使用 Func 的任何其他原因?

标签: c# .net delegates coding-style func


【解决方案1】:

Func 在非常清楚它们的用途并且输入的数量很少时很有用。

当输入的数量更大,或者意图可能存在一些歧义时 - 然后使用带有命名参数的委托会使事情变得更清晰。

【讨论】:

  • 如果输入的个数比较大,如果叫LotsOfInputFunction比Func更难记。如果意图不明确,我可以用变量名或参数名来澄清它,对吧?
  • 我的意思是每个参数的意图。例如: Func - 仅仅看这个就很难/不可能推断出它的用途。此外,添加参数可能意味着重构大量代码,并可能破坏接口。
【解决方案2】:

除了方法有Expression 参数外,它们在所有用途上都是相同的。这些需要定义为“lambda”而不是delegate。在处理IQueryable 并改为调用/解析IEnumerable(例如LINQ2SQL)时,这将是非常有问题的。

【讨论】:

    【解决方案3】:

    Func 和 Action 如果它们实际上适合您的情况,则更可取。 运行时创建程序中使用的每种类型的实例,如果您使用 Func 一次,则意味着创建了该类型的实例。在自定义委托的情况下,事情会以不同的方式进行,即使它们本质上与现有的类型相似,也会创建新类型。

    但有时自定义委托会使代码更清晰。

    【讨论】:

      【解决方案4】:

      但是我注意到微软在某些库中使用了自己的委托,例如事件处理程序。那么,它们各自的优缺点是什么?我应该什么时候使用它?

      其中一些是历史性的:在 C#3/.NET3 之前添加 Action&lt;&gt;Func&lt;&gt; 时定义的 API。对于事件,EventHandler&lt;T&gt; 是事件的更好选择,因为它强制执行正确的约定。

      【讨论】:

      • this 来自 .NET 4
      • @Louis ... WF4 的其他地方 Func&lt;&gt; is used 所以这很奇怪。是否通过一致性审查?
      【解决方案5】:

      您始终可以创建一个将 n 个输入作为类属性保存的类,并在 func 委托中将单个输入传递给类的对象

      【讨论】:

      • 这如何回答这个问题?
      猜你喜欢
      • 2011-05-27
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多