C#基礎:委托之Action和Func、Predicate的用法


Action、Action<T>:

①、Action委托的方法沒有參數也沒有返回值

②、Action<T>是Action的泛型實現

③、Action<T>委托類存在不同的變體,可以傳遞至多16種不同的參數類型

④、沒有泛型參數的Action類可以調用沒有參數的方法

例如:Action<in T1>調用帶一個參數的方法,Action<in T1, in T2>調用帶兩個參數的方法等

Func<T>:

①、Func<T>的用法和Action<T>用法類似,但是Func<T>表示引用一個帶返回類型的方法

②、Func<T>也存在不同的變體,至多可以傳遞16個參數類型和1個返回類型

例如:Func<in T1, out Resout>表示帶一個參數的方法,Func<in T1, in T2, out Resout>表示調用帶兩個參數的方法

Predicate<T>:

①、委托的方法有bool類型的返回值,等效於Func<T, bool>

結論:

①、Func<T, bool>是對delegate bool Predicate<T>(T obj)的簡化,
②、Predicate<T>又是對Func<T, bool>的簡化,
③、List<T>中的方法應該統一參數。
④、Delegate至少0個參數,至多32個參數,可以無返回值,也可以指定返回值類型
⑤、Func可以接受0個至16個傳入參數,必須具有返回值
⑥、Action可以接受0個至16個傳入參數,無返回值
⑦、Predicate只能接受一個傳入參數,返回值為bool類型

 1 using System;
 2 
 3 public class Program {
 4       public static void Main(string[] args) {
 5         Action actionNoParam = () => Console.WriteLine("無參無返回");
 6         actionNoParam();
 7 
 8         Action<string, string> ac;
 9         ac = delegate(string s1, string s2) { WriteToConsole(s1, s2); };
10         ac("1", "2");
11         ac = (s1, s2) => WriteToConsole(s1, s2);
12         ac("3", "4");
13 
14         Func<double, double, double> DoAddtion = Calculate.addtion;
15         double result = DoAddtion(20, 30);
16         Console.WriteLine("Func帶返回參數委托做加法結果為:{0}", result);
17 
18         Calculate c = new Calculate();
19         Action<double, double> DoSubstraction = c.substraction;
20         DoSubstraction(90, 20);
21         }
22 
23       private static void WriteToConsole(string string1, string string2){
24         Console.WriteLine("{0}\n{1}", string1, string2); 
25       }
26 }
27 
28 public class Calculate {
29     public static double addtion(double x, double y) {
30         return x + y;
31     }
32 
33     public void substraction(double x, double y) {
34         Console.WriteLine("Action不帶返回參數委托做減法結果為:{0}", x - y);
35     }
36 }

參考文獻:

https://www.cnblogs.com/yuzk/p/5165696.html

https://blog.csdn.net/rye_grass/article/details/66041423


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM