如何理解事件和委托

我喜欢将书中的知识看懂后形成个人的理解:

一、你如何理解委托

        如果我们不理解决委托,那应该都理解类,那我们就从类角度来看看什么是委托。

        在我看来类和委托是同一级别的东西,类它对具体的实例进行了抽象,也就是它确定了实例的基本骨架,而委托是对具体方法的抽象,它定义了具体方法的基本骨架,和类一样都是通过new 方法进行实例化,

        只是创建委托实例时要一个调用的目标方法。

     下面是委托的使用:

public delegate void myDelegate(string str); 
public static void HellowChinese(string strChinese) 
    Console.WriteLine("Good morning," + strChinese); 
    Console.ReadLine(); 
   
myDelegate d = new myDelegate(HellowChinese); 
d("Mr wang");
 
二、你如何理解事件
      如果我们不理解事件,那我们应该理解类中的字段和属性,那我们就从字段和属性角度来理解事件
       我们都知道对类中属性的赋值和取值就是调用get和set方法对字段进行操作,同样订阅和取消订阅一个事件时和属性的情况一样,实际是在调用add和remove方法,我们是对过+=和-=运算符使用委托类型的字段。
       “事件”存在的的理由和“属性”差不多,它们添加了一个封装层,实现发布、订阅模式。通常,我们不希望其它代码随意更改一个事件的处理程序,当然类能通过添加方法的方式来提供额外的访问。
      声明一个事件后编译器会将声明转换成一个具有默认add\remove实现的事件和一个私有委托类型的字段,类内的代码能看见字段,类外的代码只能看见事件。
     这样一来,表面上似乎能调用一个事件,,实际上是调用存储在字段中的委托实例。
    也就是说事件不是委托实例,它只是成对的add/remove方法,类似于属性的取值和赋值方法。
   下面是事件的使用:

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

namespace Example_EventTest
{
    class Judgment
    {
        //定义一个委托
        public delegate void delegateRun();
        //定义一个事件
        public event delegateRun eventRun;
        //引发事件的方法
        public void Begin()
        {
            eventRun();//被引发的事件
        }
    }
    class RunSports
    {
        //定义事件处理方法
        public void Run()
        {
            Console.WriteLine("运动员开始比赛");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            RunSports runsport = new RunSports();//实例化事件发布者
            Judgment judgment = new Judgment();//实例化事件订阅者
            //订阅事件
            judgment.eventRun+=new Judgment.delegateRun(runsport.Run);
            //引发事件
            judgment.Begin();
            Console.ReadKey();
        }
    }
}

 
 
    
posted @   爱生活,爱代码  阅读(718)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示