【问题标题】:Why does the .NET framework specify standard delegates (Action)?为什么 .NET 框架要指定标准委托(Action)?
【发布时间】:2013-11-05 06:20:32
【问题描述】:

.NET 框架为什么要指定标准委托?声明一个新的委托类型很简单,只需一行代码即可完成。

public delegate void Something<T>(T obj);

他们为什么要定义所有这些其他类型(Action、Action 等)?

这样做的目的和收获是什么?

http://msdn.microsoft.com/en-us/library/system.action.aspx

我想知道的另一件事是,他们接着定义了 17 个版本,除了采用不同数量的类型参数外,它们都是相同的。但为什么要停在 17 点?是什么告知了这种类型的决定?

【问题讨论】:

  • 因此您不必编写额外的代码行。
  • 但这太荒谬了。
  • 我们在项目中使用 Action/Func 代表。我们没有理由定义在我们的应用程序中使用的特定委托,因此标准的 Action/Func 委托可以满足我们的目的。至于是什么通知了该决定,没有什么比“这是最大参数数”之类的了。我认为他们只是想适应。老实说,如果您的方法有这么多单独的参数,您的代码中可能还有其他问题。
  • 所有使用 lambda 的东西都应该声明自己的委托类型吗?
  • @PaulDraper 的第一条评论完美地回答了您的问题:标准定义让您不必自己编写。您的“但这很荒谬”的回复为您赢得了反对票和基于意见的投票结束。任何优秀的程序员都知道,尽量减少编写的代码行数是一件好事。因此,虽然 Sriram 的回答很好并且值得一票,但它是对 Paul 评论的补充。

标签: c# .net delegates


【解决方案1】:

因为他们想明确地为TPLLinq 公开一些代表,所以他们创建了ActionAction<T>Func<> 代表。

Enumerable 类在方法数量上使用Func<>

Task 类仅建立在 Func<>Action<> 代表之上。

当他们在 FW 中公开 Linq 时,有必要声明像 Predicate 这样的委托,这种委托应该使用 Where 子句等等。您可以在单行中声明自己的委托。但关键是你不能将你的委托传递给框架方法,因为框架在编译时没有你的委托。

因此框架开发人员决定将这些标准委托添加到 .Net 框架本身中。

注意:您可以将自己的委托传递给“BCL”类型作为System.Delegate 类型,他们可以使用DynamicInvoke 方法来调用它,但这是一种矫枉过正。在处理会降低性能的“ValueTypes”时,它需要装箱/拆箱,不仅是 DynamicInvoke 本身表现不佳的候选者。

【讨论】:

  • 嗨,Sriram,您介意为我详细说明一下吗?这似乎是我正在寻找的答案类型......
  • 谢谢斯里拉姆。我想这就是我一直在寻找的答案。我会根据你的回答做更多的研究。
  • @SriramSakthivel 正确答案。但是,这不会是装箱/拆箱-装箱/拆箱仅在将值类型转换为/从值类型转换为引用类型时才会发生
  • @markmnl 是的,我知道。在我的示例中,我提到了 Where 子句,因此它返回 bool 这是一个值类型。我在回答问题时想到了这一点。这涉及拳击:)
【解决方案2】:

如果一段代码声明:

public delegate void SingleArgumentMethod<T>(T obj);
DoSomething(SingleArgumentMethod<int> thingDoDo);

还有一些其他代码声明:

public delegate void OneArgumentMethod<T>(T obj);
PerformAction(OneArgumentMethod<int> theAction);

那么因为SingleArgumentMethod&lt;int&gt;OneArgumentMethod&lt;int&gt; 将是不相关的类型,所以DoSomething 将没有好的方法将其接收到的委托传递给PerformAction。相反,它必须使用来自thingToDo 的方法指针和目标来生成OneArgumentMethod&lt;int&gt; 的实例,并将其传递给PerformAction。但是,如果这两种方法都使用了相同的委托定义,那么就不需要这种复杂性,DoSomething 可以简单地调用PerformAction(thingToDo);

【讨论】:

    猜你喜欢
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2014-06-25
    • 1970-01-01
    相关资源
    最近更新 更多