简介:
委托类型用来表示对具有特定参数列表和返回类型的方法的引用。
可以理解为函数方法的容器,即表示函数方法的变量类型,用来存储、传递函数。
委托变量存储的函数对应相同返回值和参数类型的函数。
委托和类一样,是一种用户自定义类型,但类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定义操作。
语法:关键字:delegate
访问修饰符 delegate 返回值类型 委托名(参数列表);
声明在class和namespace中,更多写在namespace中。
访问修饰符为public,写在namespace中,可以在其他namespace中使用。
自定义委托:
- 无参无返回值的委托,定义了委托存储的是无参无返回值的函数。
delegate void MyFun1();
- 无参有int返回值的委托,定义了委托存储的是无参有int返回值的函数。
delegate int MyFun2(int value);
- 委托支持泛型,可以让参数返回值可变。一般很少这样使用。
delegate T MyFun3<T,W> (T t, W w);
使用自定义委托:可以作为类的成员参数和函数的参数。
class Test
{
public MyFun1 MyFun1;
public MyFun2 MyFun2;
public void TestFun(MyFun1 MyFun1, MyFun2 MyFun2)
{
//可以先执行其他逻辑代码块
int i = 1;
i++;
//然后再执行委托存储的函数,或者将得到的内容作为参数传入委托存储的函数中执行
MyFun1();
MyFun2(i);
}
}
public class Program
{
static void Main(string[] args)
{
//使用自定义委托
//委托MyFun1的变量myFun1装载(存储)了函数Fun1
MyFun1 myFun1 = new MyFun1(Fun1);
//写法2
MyFun1 myFun1_0 = Fun1;
//可以先执行其他逻辑,再执行委托变量中存储的函数
Console.WriteLine("执行代码逻辑1");
Console.WriteLine("执行代码逻辑2");
//执行委托变量中存储的函数,写法1:.Invoke
myFun1.Invoke();
//执行委托变量中存储的函数,写法2:(),
myFun1();
MyFun2 myFun2 = Fun2;
//可以先执行其他逻辑,再执行委托变量中存储的函数
Console.WriteLine("===========执行代码逻辑=============");
Console.WriteLine(Fun2(1));
}
}
多播委托:委托变量可以存储多个函数()
委托中存储多个函数,执行时会依次执行存储的函数。
//增
// myFun1 += Fun1;
//删
// myFun1 -= Fun1;
//清空
// myFun1 = null;
系统自定义的委托:关键字:Action;Func
系统提供的委托足够日常使用。
public class Program
{
static void Main(string[] args)
{
//系统自定义的委托
//Action;Func
//系统定义的无参无返回值函数的委托,Action
Action action = Fun1;
action();
//系统定义的有参无返回值函数的委托,Action<int>
Action<int> action1= Fun4;
//系统定义的有参无返回值函数的委托,可以传多个参数,最多16个参数
Action < int,string,int[]> action2 = Fun5;
//系统定义的无参有返回值函数的委托,Func<int>
Func<int> func = Fun3;
//系统定义的有参有返回值函数的委托,Func<int,int>
Func<int,int> func1 = Fun2;
//系统定义的有参有返回值函数的委托,可以传多个参数,最多16个参数
Func<int, int, string> func2 = Fun6;
}
static void Fun1()
{
Console.WriteLine("这是函数Fun1:无参无返回值");
}
static int Fun2(int value)
{
Console.WriteLine("这是函数Fun2:有参有返回值");
return 0;
}
static int Fun3()
{
Console.WriteLine("这是函数Fun3:无参有返回值");
return 0;
}
static void Fun4(int value)
{
Console.WriteLine("这是函数Fun4:有参无返回值");
}
static void Fun5(int value,string value1, int[] value2)
{
Console.WriteLine("这是函数Fun4:有多个参数无返回值");
}
static string Fun6(int value, int value1)
{
Console.WriteLine("这是函数Fun6:有多个参数有返回值");
return "";
}
}