Delegate
声明委托,委托的声明与方法类似,只是需要在方法前加上 delegate 关键字,注:delegate与Delegate是有区别的,在声明时要用delegate
例:delegate void i(int x); 声明一个参数为int型,无返回值的委托
delegate void i(int x);
static void Main(string[] args)//静态方法里面只能调用静态方法
{
i invoker = iMethod;
int x = 8;
invoker(x);//之后就是用委托来调用方法,与iMethod(x)效果相同
invoker.Invoke(x);//同样可以触发委托,与上效果一致
iMethod(x);
}
public static void iMethod(int x)
{
Console.WriteLine("{0}", x);
}
委托所调用的方法要与委托类型需要一致
Action,Func
Action委托,Func委托,它们是系统委托,不再需要声明委托 如delegate void i(int x);
Action委托无返回值,有0个或多个参数
static void Main(string[] args)
{
Action<int, double> invoker = iMethod;//泛型,类似List,但是Action<int,double>,方法的参数类型与Action相对应
int x = 8;
double y = 2;
invoker(x, y);
}
public static void iMethod(int x, double y)
{
Console.WriteLine("{0}", x * y);
}
Func委托,有返回值,有0个或多个参数
Func和Action用法基本一致,但是由于Func有返回值,<>最后一个对应返回值类型
static void Main(string[] args)
{
Func<int, double, String> invoker = iMethod;//Func和Action用法基本一致,但是由于Func有返回值,<>最后一个对应返回值类型
int x = 8;
double y = 2;
invoker(x, y);
}
public static string iMethod(int x, double y)
{
string s = x + "+" + y;
return s;
}
多播委托
多播委托一般声明返回值类型为void,+= 增加事件,-= 减少事件
若多播委托取返回值,一般是得到最后执行事件的返回值
delegate int dele(int x);
static void Main(string[] args)
{
dele invoker = iMethod;
invoker += iMethod2;//+= 增加事件
int x = 8;
Console.WriteLine(invoker(x));//若是第一个事件,输出x为8,第二个事件输出返回值为9
Console.ReadKey();
}
public static int iMethod(int x)
{
Console.WriteLine(1 + "+" + 2);
return x;
}
public static int iMethod2(int x)
{
Console.WriteLine("END!");
return ++x;
}
匿名方法 Lambda表达式
匿名方法顾名思义,就是没有名字的方法,是对委托的简化
例:
Func<int, int, int> plus = delegate (int a, int b)
{
return a + b;
};
Lambda表达式又是对匿名方法的简化
将上面的匿名方法进行简化
Func<int, int, int> plus = (a, b) => { int c = a + b; return c; };//=(参数)=>{方法体}
Func<int, int, int> plus = (a, b) => a+b;