C#从入门到精通19委托(一) 概念介绍

    xiaoxiao2025-03-13  59

    一、定义

    委托(delegate)是C#语言的一种指针,是函数指针的升级版。

    C语言语法中函数指针定义及使用样例

    #include <stdio.h> //c语言中的函数指针类型定义 typedef int(*Calc)(int a, int b); int Add(int a, int b){return a + b;} int Sub(int a, int b){return a - b;} int main() { int x = 100; int y = 200; int z = 0; //普通函数的调用 z = Add(x, y); printf("%d+%d=%d\n", x, y, z); z = Sub(x, y); printf("%d+%d=%d\n", x, y, z); //函数指针使用 Calc funcPoint1 = &Add; Calc funcPoint2 = ⋐ //函数指针调用 z = funcPoint1(x, y); printf("%d+%d=%d\n", x, y, z); z = funcPoint2(x, y); printf("%d+%d=%d\n", x, y, z); }

    二、直接调用与间接调用 直接调用:通过函数名来调用函数,CPU通过函数名直接获得函数所在地址并开始运行。 间接调用:通过函数指针来调用函数,CPU通过读取函数指针存储的值获得函数所在地址并开始执行。

    三、委托的简单使用 Action委托 Func委托

    使用C#类库中已经定义好的Action及Func委托定义委托。样例说明

    using System; namespace DelegateExample { class Program { static void Main(string[] args) { int x = 100; int y = 200; int z = 0; //---------------------------------------------------------------------------- //调用类的方法,需首先实例化对象 Calculator cal = new Calculator(); //直接调用类实例中的方法report() cal.Report(); //输出第一次"I have 3 mothods." //使用委托方式间接调用Calculator()实例对象的Report()方法 //Action关键字用来定义无返回值的委托 Action action = new Action(cal.Report); action.Invoke();//输出第二次"I have 3 mothods." //使用委托间接调用对象方法可以使用简便写法。 action(); //输出第三次"I have 3 mothods." //----------------------------------------------------------------------------- //使用委托方式间接调用Calculator()实例对象的Add()和Sub()方法 //Func关键字用来定义有形参和返回值的委托 Func<int, int, int> funcAdd= new Func<int, int, int>(cal.Add); Func<int, int, int> funcSub = new Func<int, int, int>(cal.Sub); z = funcAdd.Invoke(x, y); Console.WriteLine(z); z = funcSub.Invoke(x, y); Console.WriteLine(z); //----------------------------------------------------------------------------- //Func类型委托对象简单调用方式调用(去掉了Invoke方法) z = funcAdd(x, y); Console.WriteLine(z); z = funcSub(x, y); Console.WriteLine(z); } } public class Calculator { public void Report() { Console.WriteLine("I have 3 mothods."); } public int Add(int x ,int y) { return x + y; } public int Sub(int x, int y) { return x - y; } } }

    C#自定义委托

    namespace DelegateExample { //自定义委托类型实例化 public delegate double Calc(double x, double y); class Program { static void Main(string[] args) { double x = 100; double y = 200; double z = 0; //调用类的方法,需首先实例化对象 Calculator cal = new Calculator(); //自定义委托类型实例化 Calc calc1 = new Calc(cal.Add); Calc calc2 = new Calc(cal.Sub); Calc calc3 = new Calc(cal.Mul); Calc calc4 = new Calc(cal.Div); //自定义委托调用 z = calc1.Invoke(x, y); Console.WriteLine(z); z = calc2.Invoke(x, y); Console.WriteLine(z); z = calc3.Invoke(x, y); Console.WriteLine(z); z = calc4.Invoke(x, y); Console.WriteLine(z); } } public class Calculator { public void Report() { Console.WriteLine("I have 3 mothods."); } public double Add(double x, double y) { return x + y; } public double Sub(double x, double y) { return x - y; } public double Mul(double x, double y) { return x * y; } public double Div(double x, double y) { return x / y; } } }

    上例中自定义委托实例调用的简化调用方式

    z = calc1(x, y); Console.WriteLine(z); z = calc2(x, y); Console.WriteLine(z); z = calc3(x, y); Console.WriteLine(z); z = calc4(x, y); Console.WriteLine(z);

     

    最新回复(0)