首页 > 其他 > 详细

什么是委托,非自定义委托与自定义委托

时间:2019-08-22 13:54:32      阅读:117      评论:0      收藏:0      [点我收藏+]

委托是个啥呢?

委托是个类,我们来验证一下

using System;
using System.Collections.Generic;

namespace CustomizeDelegate

{

  class Program
  {
    static void Main(string[] args)  
    {
      Type t = typeof(Action);
      Console.WriteLine(t.IsClass);//返回true,说明Action委托是类

    }

  }

}

程序结果:
true
所以证明委托是个类。

非自定义的Action和Func委托

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DeleGateClass
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建一个对象,这也我们可以用他的方法
            Calculator Deli = new Calculator();

            //Action委托类,构造函数(对象.函数名)
            Action action = new Action(Deli.Report);//Action(不加(),仅传入无返回值(返回值为void)的函数名),只需要方法名,而不是调用这个方法
            //action这个委托指向了Deli.Report()这个方法

            ///直接调用,不通过委托
            Deli.Report();

            ///间接调用,通过委托
            action.Invoke();//在拥有此控件的基础窗口句柄(对程序语句是二两拨千斤的存在,因此叫句柄)的现呈上同步执行指定的委托(同步)

            //模仿函数指针书写格式
            action();


            Func<int, int, int> Func1 = new Func<int, int, int>(Deli.Add);
            Func<int, int, int> Func2 = new Func<int, int, int>(Deli.Sub);

            int x = 100;
            int y = 200;
            int z = 0;

            ///间接调用
            z = Func1.Invoke(x, y);
            Console.WriteLine(z);

            z = Func2.Invoke(x, y);
            Console.WriteLine(z);

            //模仿函数指针书写格式
            z = Func1(x, y);
            Console.WriteLine(z);

            z = Func2(x, y);
            Console.WriteLine(z);
        }
    }
    /// <summary>
    /// 计算器类,它包括加减功能
    /// </summary>
    class Calculator
    {
        public void Report()
        {
            Console.WriteLine("I have 3 methods");
        }
        /*加*/
        public int Add(int a, int b)
        {
            int result = a + b;
            return result;
        }
        /*减*/
        public int Sub(int a, int b)
        {
            int result = a - b;
            return result;
        }
    }
}

程序结果:
  
I have 3 methods——Deli.Report(); ///直接调用,不通过委托
I have 3 methods——action.Invoke(); ///间接调用,通过委托
I have 3 methods——action();//模仿函数指针书写格式
300——z = Func1.Invoke(x, y);Console.WriteLine(z);///间接调用
-100——z = Func2.Invoke(x, y);Console.WriteLine(z);
300——z = Func1(x, y);Console.WriteLine(z);//模仿函数指针书写格式
-100——z = Func2(x, y);Console.WriteLine(z);
请按任意键继续. . .
  

自定义Calc委托

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CustomizeDelegate
{
    //委托类(因为是类,与其他类平级,所以声明在命名空间里)的声明格式与普通类不同,他的声明格式是仿照函数指针
    public delegate double Calc(double Variable1, double Variable2);
    //这种数据类型从什么地方都可以访问,公开的(public)
    //告诉编译器我现在要声明一个委托(delegate)
    //目标方法的返回值类型(double)
    //给委托起个名(Calc)
    //目标方法的参数列表((double Variable1, double Variable2))
    //分号(;)
    class Program
    {
        static void Main(string[] args)
        {
            Calculator Deli = new Calculator();
            //创建Calcuator类的实例Deli,有了这个实例之后才能访问它的方法
            Calc calcAdd = new Calc(Deli.Add);
            //创建Calc委托的实例calcAdd,这里要求在传入方法即委托指向的目标方法,要求参数列表是两个double类型参数,返回值也是double类型
            Calc calcSub = new Calc(Deli.Sub);
            Calc calcMul = new Calc(Deli.Mul);
            Calc calcDiv = new Calc(Deli.Div);

            double a = 100;
            double b = 200;
            double c = 0;

            c = calcAdd.Invoke(a, b);
            Console.WriteLine(c);
            c = calcSub(a, b);
            Console.WriteLine(c);
            c = calcMul(a, b);
            Console.WriteLine(c);
            c = calcDiv(a, b);
            Console.WriteLine(c);
        }
    }

    class Calculator
    {
        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;
        }
    }
}

程序结果:
300
-100
20000
0.5
请按任意键继续. . .

什么是委托,非自定义委托与自定义委托

原文:https://www.cnblogs.com/maomaodesu/p/11393254.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!