委托的返回值类型与参数必须与方法一致 例如以下三种使用方式: 1.无参数无返回值: private delegate v

时间:2022-06-22 08:26:17

一、自界说委托:
自界说委托需要用到关键字delegate
界说的委托想要挪用要领时,委托的返回值类型与参数必需与要领一致
例如以下三种使用方法:
1.无参数无返回值:

private delegate void GetValue();//界说的委托 private static void PrintMsg() //委托需要挪用的要领 { Console.WriteLine("通过委托挪用无参数的函数"); }

这时委托的挪用方法是:

GetValue getValue = PrintMsg; //创建一个委托东西将要领指定给委托 getValue(); //挪用

2.有参数无返回值:

private delegate void GetValue2(int i); private static void PrintMsg2(int i) { Console.WriteLine("通过委托挪用有参数的函数"+i); }

这时委托的挪用方法是:

GetValue2 getValue2 = PrintMsg2; getValue2(20); //这时注意需要给委托传参

3.有返回值及参数:

private delegate int GetValue3(int i); private static int PrintMsg3(int i) { return i; } GetValue3 getValue3 = PrintMsg3; int data=getValue3(100); //可以界说变量去接收返回的数据

二、vs中自带的委托

1.Action委托:
界说形式:public delegate void Action<in T>(T obj);
Action委托是没有返回值的不能对有返回值的要领使用
Action<int> a = GetStr; //此中尖括号里面为要领的参数有几个参数就需要设置几个没有的话可以不写尖括号
a(20);
2.Func委托:
界说:
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
Func委托必需有返回值并且尖括号里面的最后一个为返回的数据其余的为参数.

使用要领:
private static int PrintMsg3(int i)
{
return i;
}
Func<int,int> f =PrintMsg3;
int data=f(100);

注意这两个委托至多有16个参数(因为里面只写了16个重载)
三、匿名要领与lambda表达式:
匿名要领:
匿名要领与lambda表达式是基于委托的存在
匿名要领是不需要写返回值与要领名字的
如果需要用无返回值的匿名要领可以用Action,用有返回值的可以用Func

例如:
用匿名要领写一个无返回值可以输出两个数的和:
//因为不需要返回值可以用Action界说而需要两个数的和所以需要两个参数
Action<int, int> a = delegate(int i, int m)
{
Console.WriteLine(i + m);
};
a(3, 5);
用匿名要领写一个有返回值可以输出两个数的和:
Func<int, int, int> f = delegate(int a, int b)
{
return a + b;
};
Console.WriteLine(f(5,6));

lambda表达式:
使用环境:在写一个不经常用到的一个函数时可以考虑使用,因为如果不经常使用阿谁函数还要再给它单独写一个要领太占代码量了
lambda表达式其实是匿名要领的另一种表示形式它没有返回值没有参数类型,如果需要参数可以直接写参数名字不需要给类型
界说方法:
委托类型 委托的变量名=(参数1,参数2,...)=> //不需要参数时可以不用写参数直接()=>
{
    //lambda表达式的函数体

};

下面来几个栗子:

//无参数的Action 委托 Action a1 = () => { Console.WriteLine("这是一个没有参数的lambda表达式"); }; a1(); //有参数的Action 委托 Action<int> a2 = (x) => { Console.WriteLine("这是有一个参数的lambda表达式,参数类型为"+x.GetType()+"数据是:"+x); }; a2(2); //无参数的Func委托(Func因为必需要有返回值所以尖括号里至少有一个类型) Func<int> f = () => { //函数体 int x = 2; int y = 3; return x * y; }; Console.WriteLine(f()); //有参数和返回值的Func委托 Func<int,int> f1 = (c) => { //函数体 return c; }; Console.WriteLine(f1(5));