为什么.NET框架指定了标准委托?声明一个新的委托类型很简单,可以在一行代码中完成。
public delegate void Something<T>(T obj);
为什么他们定义所有其他类型(行动,行动等)?
目的是什么以及由此获得什么?
http://msdn.microsoft.com/en-us/library/system.action.aspx
我想知道的另一件事是他们继续定义17个版本,除了它们采用不同数量的类型参数之外都是相同的。但为什么要停在17岁?什么通知这种决定?
答案 0 :(得分:7)
因为他们希望明确为TPL
和Linq
公开一些代理,所以他们创建了Action
,Action<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);
。