c#中的委托

委托:delegate

本质就是个密封类,与类平级
用于封装,解耦

声明语法

// 使用 delegate 关键字声明一个委托
delegate void Func(int x);

简单使用

eg.一个计算器

namespace ConsoleApp;

class Program
{
    /**
     * 声明委托
     */
    public delegate double CalculateFunction(double x, double y);
    
    /**
     * 加法
     */
    static double Add(double x, double y)
    {
        return x + y;
    }

    /**
     * 减法
     */
    static double Subtract(double x, double y)
    {
        return x - y;
    }

    // Test方法的参数就是一个方法(委托)
    static void Test(CalculateFunction calculateFunction)
    {
        Console.Write("请输入x的值:");
        double x = Convert.ToDouble(Console.ReadLine());
        Console.Write("请输入y的值:");
        double y = Convert.ToDouble(Console.ReadLine());
        
        double result = calculateFunction(x, y);
        Console.WriteLine($"x与y委托计算的结果>>>{result}");
    }
    
    static void Main(string[] args)
    {
        // 写法一:
        // CalculateFunction cal = new CalculateFunction(Add);
        // double d = cal(3, 4);
        
        // 写法二:
        // Test(new CalculateFunction(Add));
        
        // 写法三:
        Test(Add);
        Test(Subtract);
        
        Console.ReadKey();
    }
}

常用方法

对委托最常使用的方法是 Invoke()BeginInvoke() / EndInvoke()
Invoke() 会调用已附加到特定委托实例的所有方法。
eg.简单使用 +=、-=、Invoke()

namespace ConsoleApp;

class Program
{

    public delegate double CalculateFunction(double x, double y);
    public static CalculateFunction calFunc;
    
    static double Add(double x, double y) => x + y;
    
    static double Test2(double x, double y)
    {
        Console.WriteLine($"委托实现 Add >_<");
        return Add(x, y);
    }
    
    static void Main(string[] args)
    {
        // 实例化委托(订阅)
        calFunc += Test2;
        // 取消订阅
        // calFunc -= Test2;
        
        // 调用委托
        calFunc?.Invoke(11, 22);
    }
}

与接口对比

接口实现了类的依赖注入

委托实现了方法的依赖注入

posted @ 2024-11-28 17:12  Rix里克斯  阅读(26)  评论(0)    收藏  举报