在C#中,委托(Delegate)是一种特殊的类型,它持有对方法的引用。委托可以指向静态方法、实例方法或Lambda表达式。它们在C#中用于实现回调机制、事件处理以及泛型方法的实现。
委托的主要特点包括:
-
类型安全:委托是强类型的,这意味着它们在编译时就确定了要引用的方法的签名。
-
多播:委托可以链接多个方法调用。当委托被调用时,它将按顺序调用所有链接的方法。
-
灵活性:委托可以用于将方法作为参数传递给其他方法,使得代码更加灵活和模块化。
-
匿名方法:可以使用Lambda表达式或匿名方法来定义委托,而不需要显式创建方法定义。
委托是一种引用类型,其实他是一个类,保存方法的指针,,他指向一个方法,当我们调用委托的时候,这个方法就立即被执行
实现委托的三个步骤
1.定义委托
2.实例化委托
3.执行委托
自定义委托
namespace _7._15day02
{
public delegate double Add(double x, double y);
internal class Program
{
public static double Add(double x, double y)
{
return x + y;
}
public static double Sub(double x, double y)
{
return x - y;
}
static void Main(string[] args)
{
Add add = new Add(Add);
double result1 = add(12.0, 24.0);
Console.WriteLine($"这个是加法的结果{result1:F2}");
Add add1 = new Add(Sub);
double result2 = add1(24.0, 12.0);
Console.WriteLine($"这个是减法的结果{result2:F2}");
}
}
}
结果为
泛型委托类型
-
Action:表示无返回值的方法。可以有0到16个参数。
-
Func<>:表示有返回值的方法。可以有0到16个参数,并且最后一个参数是返回类型。
-
Predicate<> :是
Func<T, bool>
的一个特殊形式,用于表示接受一个参数并返回布尔值的方法。
namespace _7._15day01
{
internal class Program
{
public void print()
{
Console.WriteLine("print");
}
public int add(int x,int y)
{
return x+y;
}
static void a(int x, Action a)
{
a();
Console.WriteLine(x);
}
static int b(int x, Func<int, int, int> s ,int a,int b)
{
return x + s(a, b);
}
static void Main(string[] args)
{
Program program = new Program();
int x = 0;
int a1 = 100;
int b1= 100;
int[] arr = {1,2,3,4,5,6,7};
a(x, program.print);
int result= b(20, program.add,40,40);
Console.WriteLine("-------------------------------");
Console.WriteLine(result);
}
}
}
结果为
多播委托
多播委托 可以使用+=去增加方法
也可以使用 -=去删除方法
可以在一个委托里面加另一个委托 前提是这两个委托是同一个委托