为什么.NET框架指定标准委托(Action)?

时间:2013-11-05 06:20:33

标签: c# .net delegates

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

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

为什么他们定义所有其他类型(行动,行动等)?

目的是什么以及由此获得什么?

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

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

2 个答案:

答案 0 :(得分:7)

因为他们希望明确为TPLLinq公开一些代理,所以他们创建了ActionAction<T>Func<>代表。< / p>

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

Task课程仅建立在Func<>以及Action<>代表之上。

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

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

注意:您可以将自己的委托作为System.Delegate类型传递给“BCL”类型,并且可以使用DynamicInvoke方法来调用它,但这样做太过分了。它在处理降低性能的“ValueTypes”时需要装箱/拆箱,而不仅仅是DynamicInvoke本身表现不佳的候选人。

答案 1 :(得分:0)

如果一段代码声明:

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

和其他一些代码声明:

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

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