CLR環境中給咱們內置了幾個經常使用委託Action、 Action<T>、Func<T>、Predicate<T>,通常咱們要用到委託的時候,儘可能不要本身再定義一 個委託了,就用系統內置的這幾個已經可以知足大部分的需求,且讓代碼符合規範。html
Action封裝的方法沒有參數也沒有返回值,聲明原型爲:數組
1 public delegate void Action();
用法以下:post
1 public void Alert() 2 { 3 Console.WriteLine("這是一個警告"); 4 } 5 6 Action t = new Action(Alert); // 實例化一個Action委託 7 t();
若是委託的方法裏的語句比較簡短,也能夠用Lambd表達式直接把方法定義在委託中,以下:spa
1 Action t = () => { Console.WriteLine("這是一個警告"); }; 2 t();
Action<T>是Action的泛型實現,也是沒有返回值,但能夠傳入最多16個參數,兩個參數的聲明原型爲:code
1 public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
用法以下:htm
1 private void ShowResult(int a, int b) 2 { 3 Console.WriteLine(a + b); 4 } 5 6 Action<int, int> t = new Action<int, int>(ShowResult);//兩個參數但沒返回值的委託 7 t(2, 3);
一樣也能夠直接用Lambd表達式直接把方法定義在委託中,代碼以下: 對象
1 Action<int, int> t = (a,b) => { Console.WriteLine(a + b); }; 2 t(2, 3);
Func<T>委託始終都會有返回值,返回值的類型是參數中最後一個,能夠傳入一個參數,也能夠最多傳入16個參數,但能夠傳入最多16個參數,兩個參數一個返回值的聲明原型爲:blog
1 public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
用法以下:原型
1 public bool Compare(int a, int b) 2 { 3 return a > b; 4 } 5 6 Func<int, int, bool> t = new Func<int, int, bool>(Compare);//傳入兩個int參數,返回bool值 7 bool result = t(2, 3);
一樣也能夠直接用Lambd表達式直接把方法定義在委託中,代碼以下:it
1 Func<int, int, bool> t = (a, b) => { return a > b; }; 2 bool result = t(2, 3);
Predicate<T>委託表示定義一組條件並肯定指定對象是否符合這些條件的方法,返回值始終爲bool類型,聲明原型爲:
1 public delegate bool Predicate<in T>(T obj);
用法以下:
1 public bool Match(int val) 2 { 3 return val > 60; 4 } 5 6 Predicate<int> t = new Predicate<int>(Match); //定義一個比較委託 7 int[] arr = { 13, 45, 26, 98, 3, 56, 72, 24 }; 8 int first = Array.Find(arr, t); //找到數組中大於60的第一個元素
一樣也能夠直接用Lambd表達式直接把方法定義在委託中,代碼以下:
1 Predicate<int> t = val => { return val > 60;}; //定義一個比較委託 2 int[] arr = { 13, 45, 26, 98, 3, 56, 72, 24 }; 3 int first = Array.Find(arr, t); //找到數組中大於60的第一個元素
轉自:https://www.cnblogs.com/maitian-lf/p/3671782.html