ActionT和FuncT委托
??????? 泛型Action<T>委托和Func<T>委托是系統定義的兩個泛型委托。
??????? Action<T>委托表示引用一個返回類型為Void的方法。這個委托存在不同的變體,可以傳遞之多16個不同的參數類型。同時,沒有泛型參數的Action類可以調用沒有參數的方法。例如,Action<in T>表示有一個輸入參數的方法,Action<in T1,in T2>表示有兩個輸入參數的方法。
??????? Func<T>可以以類似的方法使用。不過Func<T>允許調用帶返回參數的方法。Func<T>也有不同的變體,之多可以傳遞16個參數和一個返回類型。例如:Func<out TResult>委托類型可以無參的帶返回類型的方法,Func<in T1,inT2,out Tresult>表示帶兩個參數和一個返回類型的方法。
??????? 需要記住一個東西,Action<T>中的T可以有多個,但這些T類型都表示不同的輸入類型。Func<T>可以表示帶輸出的方法,T可以有多個,且只有最后一個表示輸出即最后一個是返回類型。Func<in T1,inT2,out Tresult>中的字符in、out在實際代碼中是不會出現的。在VS中,可以通過IntelliSense查看:
Action<T> 的16參數封裝:
?
Func<T>16參加一個返回的封裝
?
?
?
下邊通過一個簡單的代碼演示一下這兩個泛型委托與一般委托的異同。
第一步:先定義倆函數:
public double MultiplyByTwo(double x) {return x * 2; } public double Square(double x) {return x * x; }?
這倆函數有共同的特征:輸入和返回類型都是double
第二步:定義委托數組,并用這兩個方法的方法名初始化數組:
delegate double DoubleOp(double x);DoubleOp[] MyDoubleOp = {this.MultiplyByTwo,this.Square};Func<double, double>[] myFunc = //{this.MultiplyByTwo,this.Square};?
最后:查看輸出
for (int i = 0; i < MyDoubleOp.Length; i++) {Console.WriteLine(MyDoubleOp[i](1.414)); }for (int i = 0; i < myFunc.Length; i++) {Console.WriteLine(myFunc[i](2.236)); }?
比較一下,其實泛型委托和自定義的委托在使用上沒什么不同。只不過泛型委托Func<T>系統已經為我們定義好了,直接使用就可以了,不需要再進行這樣的定義delegate double DoubleOp(double x);。另一個泛型委托Action <T>的使用也是一樣的,只不過不能有返回類型而已。
貼出完整的代碼:
一個簡單的類MyClass類:
public class MyClass {delegate double DoubleOp(double x);public double MultiplyByTwo(double x){return x * 2;}public double Square(double x){return x * x;}public void myDelegate(){DoubleOp[] MyDoubleOp = {this.MultiplyByTwo,this.Square};for (int i = 0; i < MyDoubleOp.Length; i++){Console.WriteLine(MyDoubleOp[i](1.414));}Func<double, double>[] myFunc ={this.MultiplyByTwo,this.Square};for (int i = 0; i < myFunc.Length; i++){Console.WriteLine(myFunc[i](2.236));}} }?
入口函數:
class Program {static void Main(){EventsSample.MyClass myClass = new EventsSample.MyClass();myClass.myDelegate();Console.Read();}}?
Technorati 標簽: Action<T>,Func<T>,委托總結
以上是生活随笔為你收集整理的ActionT和FuncT委托的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习过osgi 发布bundle
- 下一篇: MiniDao 比Mybatis还灵活