Administrator
发布于 2025-10-14 / 3 阅读
0
0

委托是什么

一句话理解:

委托是一个“可以指向方法的变量”。 它把“方法”当作“数据”来传递。


一、委托是什么

"委托是一种类型,它可以引用方法,让方法像变量一样被传递和调用"

定义委托就是定义方法头

定义委托就是定义一种可以引用特定签名方法的类型

  • 定义委托 = 定义一种新的"方法类型"或"函数类型"

  • 定义方法 = 定义具体的功能实现

  • 委托是方法的抽象模板,方法是委托的具体实现

二、定义委托的语法

// 传统委托定义
[访问修饰符] 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 输入);     // 有参数,有返回值

步骤

操作

示例

1

定义委托类型

delegate int Operation(int a, int b);

2

创建匹配方法

int Add(int a, int b) => a + b;

3

声明委托变量

Operation op;

4

指向具体方法

op = Add;op = (a,b) => a + b;

5

调用委托

int result = op(5, 3);

委托实例化和使用

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}");
    }
}



评论