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

一、定义

委托(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 = &Sub;
	//函数指针调用
	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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值