2

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

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

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

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

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

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

4

2 回答 2

7

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

可枚举Func<>在方法数量中的使用。

任务Func<>类仅建立在Action<>委托之上。

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

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

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

于 2013-11-05T06:28:27.390 回答
1

如果一段代码声明:

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

和其他一些代码声明:

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

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

于 2014-02-10T19:28:51.383 回答