欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【理解】C# 委托与事件

程序员文章站 2022-07-12 16:09:35
...

19.10.21
今日份学习知识点

委托类型(Delegate Type)用于定义一个从 System.Delegate 类派生的类型,其功能与 C++ 语言中指向函数的指针功能类似,不同的是 C++ 语言的函数指针只能够指向静态的方法,而委托除了可以指向静态的方法之外,还可以指向实例的方法。
特点:任何类或对象中的方法都可以通过委托来调用,唯一要求:方法参数类型和返回类型必须与委托的一致。
通过委托,可将方法作为实体赋值给变量
———————————————————
事件(Event)是一种使类或对象能够提供通知的成员,本质上是利用委托来实现的。
要在应程序中自定义和引发事件,必须提供一个事件处理程序(事件处理方法),以便与事件关联的委托能自动调用它。

DT.cs(DelegateTest)

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

namespace HLclassTest
{
    //1.先定义一个委托类型
    public delegate double MyFunc(double d);
    class DT
    {
        //2.声明同格式方法
        double Mul(double x)
        {
            return x * x;
        }

        double Abs(double x)
        {
            return Math.Abs(x);     //Math类中有好多方法可以用,这个是求绝对值
        }

        //4.遍历输出(这是两个嵌套的foreach,每从委托中遍历到一个函数,就遍历数组,并将每一个数组元素用函数执行)
        public void Output(double[] a,MyFunc func)
        {
            foreach(var item in a)  //foreach遍历数组a
            {
                Console.WriteLine(func(item));  //从a中得到的值用此时遍历到的函数执行
            }
        }

        internal void Output(double[] a)    //方法重载
        {
            //3.把方法放入到委托当中
            MyFunc[] myFuncs = new MyFunc[] { Mul, Abs };

            foreach(var item in myFuncs)    //从委托中遍历方法
            {
                Output(a, item);    //调用上面的两个参数的Output方法
            }
        }
    }
}

ET.cs(EventTest)

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

namespace HLclassTest
{
    class ET
    {
        //1.事件是利用委托来实现的,先定义一个委托
        public delegate void MyEventHandler(string name);

        //2.用 event 关键字声明事件
        public event MyEventHandler Handler;

        //3.定义引发事件时要调用的方法
        public void CollegeRoad()
        {
            Handler(_name);     //此时_name是构造方法中传入的参数“Panda”
        }

        //4.用构造方法注册事件( -= 是取消事件)
        string _name;
        public ET(string name)
        {
            _name = name;
            this.Handler += Baby;   //这几个函数名是在定义函数之后才合法的,通过委托,可将方法作为实体赋值给变量
            this.Handler += SchoolTime;
            this.Handler += College;
        }

        public void College(string name)
        {
            Console.WriteLine(name + ":Wao,time to go to college!");
        }

        public void SchoolTime(string name)
        {
            Console.WriteLine(name + ";Yes, time to go to school!");
        }

        public void Baby(string name)
        {
            Console.WriteLine(name + ":Little baby is born!");
        }
    }
}

Program.cs

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

namespace HLclassTest
{
    class Program
    {
        static void Main(string[] args)
        {
            double[] a = { 12, -31, -434, -123 };   //定义并给数组a赋初值
            DT dt = new DT();
            dt.Output(a);   //调用相应的只有一个参数的函数

            ET et = new ET("Panda");
            et.CollegeRoad();

            Console.ReadKey();
        }
    }
}

【理解】C# 委托与事件

相关标签: 理解

上一篇: C语言数组复制

下一篇: 题解