委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。
============================================================================================
1、delegate(常用的一种声明,匿名方法)
Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。
public delegate void MyDelegate(string name); public class MyBlogBase { private MyDelegate mydelegate; }(1) 自定义Delegate时,我们常常发现Delegate必须全局可见,才能在其他地方可见并使用,而下面Action,Func的出现改变了这一局面,这两个其实说白了就是系统定义好的Delegate。
(2) 其实匿名方法,有个优点,就是可以直接使用当前函数出现的变量,代码更简洁,但可能有些人觉得不易读
============================================================================================
2、Action(无返回值的泛型委托)
(1) Action 默示无参,无返回值的委托
(2) Action<int,string> 默示有传入参数int,string无返回值的委托
(3) Action<int,string,bool> 默示有传入参数int,string,bool无返回值的委托
(4) Action<int,int,int,int> 默示有传入4个int型参数,无返回值的委托
Action至少0个参数,至多16个参数,无返回值。
Action<T>:封装一个方法,该方法只有一个参数并且不返回值。其中T是可接收的任何类型。使用代码如下:
public static void Main() { Action<string> messageTarget; //方法是实例化 Action<T> 委托,而不是显式定义一个新委托并将命名方法分配给该委托。 messageTarget = ShowWindowsMessage; messageTarget("Hello, World1!"); // Action<T> 委托与匿名方法一起使用 messageTarget = delegate(string s) {ShowWindowsMessage(s); }; messageTarget("Hello, World2!"); //将 lambda 表达式分配给 Action<T> 委托实例 messageTarget = s => ShowWindowsMessage(s); messageTarget("Hello, World3!"); } private static void ShowWindowsMessage(string message) { MessageBox.Show(message); }
============================================================================================
必须有返回值,不成void。
public static void Main() { // 实例化 Func<T, TResult> 委托 Func<string, string> convertMethod = UppercaseString; string name = "Dakota1"; Console.WriteLine(convertMethod(name)); //将 Func<T, TResult> 委托与匿名方法一起使用 Func<string, string> convert = delegate(string s) { return UppercaseString(s);}; string name = "Dakota2"; Console.WriteLine(convert(name)); //将 lambda 表达式分配给 Func<T, TResult> 委托。 Func<string, string> convert = s => UppercaseString(s); string name = "Dakota"; Console.WriteLine(convert(name)); } private static string UppercaseString(string inputString) { return inputString.ToUpper(); }
============================================================================================
(1) predicate<int> 默示传入参数为int 返回bool的委托
Predicate有且只有一个参数,返回值固定为bool
Predicate<int> myPredicate; int[] myNum = new int[8] { 12, 33, 89, 21, 15, 29, 40, 52 }; public int[] myResult; public MyBlogBase() { myPredicate = delegate(int curNum) { if (curNum % 2 == 0) return true; else return false; }; } public void StartPredicate() { myResult = Array.FindAll(myNum, myPredicate); }上例中说明了Predicate的使用,FindAll方法中,参数2即是一个Predicate,在具体的执行中,每一个数组的元素都会执行指定的方法,如果满足要求返回true,并会被存放在结果集中,不符合的则被剔除,最终返回的集合,即是结果判断后想要的集合,此方法应用场景感觉像迭代中的yield。