一句话理解:
委托是一个“可以指向方法的变量”。 它把“方法”当作“数据”来传递。
一、委托是什么
"委托是一种类型,它可以引用方法,让方法像变量一样被传递和调用"
定义委托就是定义方法头
定义委托就是定义一种可以引用特定签名方法的类型
定义委托 = 定义一种新的"方法类型"或"函数类型"
定义方法 = 定义具体的功能实现
委托是方法的抽象模板,方法是委托的具体实现
二、定义委托的语法
// 传统委托定义
[访问修饰符] delegate [返回类型] [委托名称]([参数列表]);
// 具体示例
public delegate void MyDelegate(string message);
public delegate int CalculationDelegate(int a, int b);
public delegate bool PredicateDelegate<T>(T item);
// 声明委托类型(定义方法签名)
public delegate void 简单委托(); // 无参数,无返回值
public delegate int 计算委托(int x, int y); // 有参数,有返回值
public delegate string 格式化委托(string 输入); // 有参数,有返回值
委托实例化和使用
public class 工具类
{
public void 问好()
{
Console.WriteLine("你好!");
}
public int 平方(int x)
{
return x * x;
}
}
// 使用委托
工具类 工具 = new 工具类();
// 实例化委托
简单委托 我的委托 = 工具.问好;
计算委托 计算委托 = 工具.平方;
// 调用委托
我的委托(); // 输出:你好!
int 结果 = 计算委托(5); // 返回:25
三、从方法调用到委托的演进
示例1:直接方法调用(硬编码)
using System;
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public int Multiply(int a, int b)
{
return a * b;
}
// 可以添加更多方法
public int Subtract(int a, int b)
{
return a - b;
}
public double Divide(int a, int b)
{
if (b == 0)
throw new DivideByZeroException("除数不能为零");
return (double)a / b;
}
}
public class Program
{
public static void Main()
{
//使用:必须明确知道调用哪个方法
Calculator calculator = new Calculator();
int result1 = calculator.Add(5, 3); // 8 直接调用加法
int result2 = calculator.Multiply(5, 3); // 15
int result3 = calculator.Subtract(5, 3); // 2
double result4 = calculator.Divide(6, 3); // 2.0
Console.WriteLine($"加法结果: {result1}");
Console.WriteLine($"乘法结果: {result2}");
Console.WriteLine($"减法结果: {result3}");
Console.WriteLine($"除法结果: {result4}");
}
}
示例2:使用委托(灵活调用)
using System;
public class Calculator
{
//第二步:创建匹配方法
public int Add(int a, int b) => a + b;
public int Multiply(int a, int b) => a * b;
public int Subtract(int a, int b) => a - b;
}
public class Program
{
// 第一步:定义委托类型
//[访问修饰符] delegate [返回类型] [委托名称]([参数列表]);
delegate int Calculation(int a, int b);
public static void Main()
{
Calculator calculator = new Calculator();
//第三步:声明委托变量
//声明了一个委托变量 calc,
//它的类型是 Calculation。
Calculation calc;
// 第四步:使用委托指向不同的方法
calc = calculator.Add;
//第五步:调用委托
int result1 = calc(5, 3); // 8
// 动态选择乘法
calc = calculator.Multiply;
int result2 = calc(5, 3); // 15
// 动态选择减法
calc = calculator.Subtract;
int result3 = calc(5, 3); // 2
Console.WriteLine($"委托加法结果: {result1}");
Console.WriteLine($"委托乘法结果: {result2}");
Console.WriteLine($"委托减法结果: {result3}");
}
}