平時我們如果要用到委托一般都是先聲明一個委托類型,比如: string說明適用於這個委托的方法的返回類型是string類型,委托名Say後面沒有參數,說明對應的方法也就沒有傳入參數。 寫一個適用於該委托的方法: 最後調用: 這裡我們先聲明委托,然後再將方法傳給該委托。有沒有辦法可以不定義委托變數呢? ...
平時我們如果要用到委托一般都是先聲明一個委托類型,比如:
private delegate string Say();
string說明適用於這個委托的方法的返回類型是string類型,委托名Say後面沒有參數,說明對應的方法也就沒有傳入參數。
寫一個適用於該委托的方法:
1 public static string SayHello() 2 { 3 return "Hello"; 4 }
最後調用:
1 static void Main(string[] args) 2 { 3 Say say = SayHello; 4 Console.WriteLine(say()); 5 }
這裡我們先聲明委托,然後再將方法傳給該委托。有沒有辦法可以不定義委托變數呢?
答案是肯定的,我們可以用Func.
Func是.NET裡面的內置委托,它有很多重載。
Func<TResult>:沒有傳入參數,返回類型為TResult的委托。就像我們上面的Say委托,就可以用Func<string>來替代,調用如下:
1 static void Main(string[] args) 2 { 3 Func<string> say = SayHello; 4 //Say say = SayHello; 5 Console.WriteLine(say()); 6 }
怎麼樣,有了Func很簡單吧。看一下Func別的重載。
Func<T, TResult> 委托:有一個傳入參數T,返回類型為TResult的委托。如:
1 //委托 傳入參數類型為string,方法返回類型為int 2 Func<string, int> a = Count; 3 //對應方法 4 public int Count(string num) 5 { 6 return Convert.ToInt32(num); 7 }
Func<T1, T2, TResult> 委托:有兩個傳入參數:T1與T2,返回類型為TResult。
類似的還有Func(T1, T2, T3, TResult) 委托、Func(T1, T2, T3, T4, TResult) 委托等。用法差不多,都是前面為方法的傳入參數,最後一個為方法的返回類型。
Func也可以與匿名方法一起使用如:
1 public static void Main() 2 { 3 Func<string, int, string[]> extractMeth = delegate(string s, int i) 4 { 5 char[] delimiters = new char[] { ' ' }; 6 return i > 0 ? s.Split(delimiters, i) : s.Split(delimiters); 7 }; 8 9 string title = "The Scarlet Letter"; 10 // Use Func instance to call ExtractWords method and display result 11 foreach (string word in extractMeth(title, 5)) 12 Console.WriteLine(word); 13 }
同樣它也可以接 lambda 表達式
1 public static void Main() 2 { 3 char[] separators = new char[] {' '}; 4 Func<string, int, string[]> extract = (s, i) => 5 i > 0 ? s.Split(separators, i) : s.Split(separators) ; 6 7 string title = "The Scarlet Letter"; 8 // Use Func instance to call ExtractWords method and display result 9 foreach (string word in extract(title, 5)) 10 Console.WriteLine(word); 11 }
Func都是有返回類型的,如果我們的方法沒有返回類型該怎麼辦呢?鐺鐺鐺,這時Action就要粉墨登場了。
Action 委托:沒有傳入參數,也沒有返回類型,即Void。如:
1 static void Main(string[] args) 2 { 3 Action say = SayHello; 4 say(); 5 } 6 public static void SayHello( ) 7 { 8 Console.WriteLine("Say Hello"); 9 }
Action<T> 委托:傳入參數為T,沒有返回類型。如:
1 static void Main(string[] args) 2 { 3 Action<string> say = SayHello; 4 say("Hello"); 5 } 6 public static void SayHello(string word ) 7 { 8 Console.WriteLine(word); 9 }
Action<T1, T2> 委托:兩個傳入參數,分別為T1與T2,沒有返回類型。
Action同樣的還有許多其它重載,每個重載用法一樣,只是方法的傳入參數數量不一樣。
其實Action與Func的用法差不多,差別隻是一個有返回類型,一個沒有返回類型,當然Action也可以接匿名方法和Lambda表達式。
匿名方法:
static void Main(string[] args) { Action<string> say = delegate(string word) { Console.WriteLine(word); }; say("Hello Word"); }
Lambda表達式:
1 static void Main(string[] args) 2 { 3 Action<string> say = s => Console.WriteLine(s); 4 say("Hello Word"); 5 }