委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。
============================================================================================
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);
}
============================================================================================
(2) Func<object,string,int> 默示传入参数为object, string 返回值为int的委托
(3) Func<object,string,int> 默示传入参数为object, string 返回值为int的委托
(4) Func<T1,T2,,T3,int> 默示传入参数为T1,T2,,T3(泛型)返回值为int的委托
Func至少0个参数,至多16个参数,按照返回值泛型返回。
必须有返回值,不成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。