[英]Why does the .NET framework specify standard delegates (Action)?
.NET框架為什么要指定標准委托人? 聲明一個新的委托類型很簡單,可以在一行代碼中完成。
public delegate void Something<T>(T obj);
他們為什么要定義所有其他類型(動作,動作等)?
目的是什么以及由此獲得什么?
http://msdn.microsoft.com/en-us/library/system.action.aspx
我想知道的另一件事是他們繼續定義17個版本,除了它們采用不同數量的類型參數之外,它們都是相同的。 但是為什么停在17點呢? 是什么導致這種決定?
因為他們想要為TPL
以及Linq
公開一些委托,所以他們創建了Action
, Action<T>
和Func<>
委托。
可枚舉類在方法數量中使用Func<>
。
Task類僅在Func<>
和Action<>
委托的基礎上構建。
當他們在FW中暴露Linq
時,有必要聲明代理類似Predicate
類Predicate
,它應該與Where
子句一起操作,等等。 您可以在一行中聲明自己的委托。 但關鍵是你不能將你的委托傳遞給框架方法,因為框架在編譯時沒有你的委托。
因此,框架開發人員決定將這些標准委托添加到.Net框架本身中。
注意:您可以將自己的委托作為System.Delegate
類型傳遞給“ BCL”類型,並且他們可以使用DynamicInvoke
方法來調用它,但這實在是太過分了。 當處理降低性能的“ValueTypes”時,它需要裝箱/拆箱,而不僅僅是DynamicInvoke
本身表現不佳的候選者。
如果一段代碼聲明:
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);
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.