首页 > 其他分享 >事件和委托的悲伤故事

事件和委托的悲伤故事

时间:2024-09-30 21:54:09浏览次数:10  
标签:委托 故事 void 悲伤 指令 小强 public 函数

小强的故事

从前的从前,有一个村子,叫双空函数村,各个不同的函数相互帮衬,幸福而稳定的劳作着。

虽然村子里每个函数都是空参空返回,但每个函数脑子里都装着不一样却一生注定的指令。(即程序开始编译之后)

class 双空血统()
{

public void 指令() { }//指令里的内容越多,实力越强

}

里面有一个函数叫小强   MrQiang=new 双空血统()。小强是个不走运的孩子,刚出生的时候继承了村子的双空血统,空参空返回,这倒没什么,最可怜的是,小强甚至指令都是空的。

从小到大,小强受尽了周围人的嘲笑,老函数门背后议论小强,中年函数不让孩子和小强玩

“和那个连指令没有的三空函数玩,小心变得没指令!”

小强不甘心自己一生只能执行这几条指令,于是踏上了寻求变化之法的旅途。

一年又一年,寻寻觅觅,道法却似乎总与小强无缘。小强也慢慢开始变得消沉,没盘缠了就在街边讨钱,钱够了也不继续赶路,而是在湖边喝酒。

就这样可怜的又过活了一年...

一天,小强讨够钱照常去湖边喝酒,举杯间刻,身后一只手突然停住小强的酒杯,

“孩子,我看你骨质疏松,面色憔悴,却颇有狼子之气,来,跟我学吧”

“你是?”

“老衲化名给特,你也可以叫我伟拓大师,看你也是求道之函数,教你灵活七十二变之法可好?”

小强眼睛都放亮了,当场下跪,哭着说“师傅!请教我本领!!”

经历了三年一日复一日的淬炼,小强勤学苦练,伟拓看在眼里很是欣慰。

最后,伟拓大师把自己的delegate秘法,传授给了小强,对小强说“小强,你已经是可以独当一面的函数了,和你同类型的函数里,已经不会有能在指令上战胜你的了,你可以走了”

小强没有说话,泪流满面,给伟拓大师连磕了三个头,然后踏上了返回双空村的道路。

即使在学习完这套功法之后,小强也无法斩去曾经那个空指令方法,只能以伟拓秘法为核心再造了自己的指令内核,

因为本质上,那个原方法的空指令已经是无法改变的事实。虽然当前的委托与原生的同名,但已经因为变化之法,不再固定了。

伟拓大师之秘法:public delegate void 变化之法();

class 双空血统()
{

public void 指令() { }

public 变化之法 新指令;//得到新的指令内核

}

一路上,小强也吸取(+=)了很多同血统的函数的指令,回到村子的时候,他已经是指令最多的函数了。

村中长老看到小强吸收了那么多无参无返回的指令,觉得小强使了妖术,要惩罚小强。

然而即使小强习得了delegate秘法,但新的指令内核并无稳定性,

长老们轻松施法

MrQiang.新指令=null;

把小强的所有指令清空了,并且关小强进小黑屋待了几个月。

 

小强不服,在小黑屋的几个月,他不停的思考着破局的方法,

“可恶,要怎么才能让那些老头子失去对我的指令的控制权?难道要变成private吗?可是那样我也吸取不了别人的双空指令了!师傅!我该怎么办!”。

......此时小强隐隐的感到一阵胃疼

“呓!胃疼......”

忽然之间,金光乍现,小强感受到一股前所未有的力量似乎流入了他的血液。这股力量不同于第一次习得变化之法产生的指令,而是像,得到了第二个可吸取别人的指令内核,并且和之前秘法修炼出的指令内核互相独立。

“?!!这种感觉!!”

伟拓大师之秘法:public delegate void 变化之法();

class 双空血统()
{

public void 指令() { }

public 变化之法 新指令;//只是伟拓秘法

public event 变化之法 第二新指令;//得到胃疼刺激的变化之法的再延伸

}

 两个月后,小强终于出小黑屋了,这一次,小强带着新的指令内核,为了防止再次被清空,他又离开了村子,去吸取漂泊四海的双空函数的指令。

而这一次,一过就又是三年,小强带着成吨的指令,再次回到了村子,村里的人对小强如此之多的指令再次议论纷纷,觉得小强又用了妖术,向长老告状。

而现在,长老们也无能为力了,因为小强现在的指令都在第二新指令里,已经是升级版的伟拓秘法了,外部已经不能再随意修改小强的指令了,

而唯一能再次清空小强指令的办法,只有一个一个的找到散落在天涯的被小强吸取(+=)过的双空人,从他们取消(-=)自己被吸取的部分。

故事的最后,小强因为指令数的庞大,拥有强大力量,双空村从此改名三空村

小强升职加薪,月薪过万,迎娶白富美,走上函数巅峰。

现在再看下专业一点的说明

事件给委托增加了保护机制

委托明明有各种函数在里面,却灵活的像个变量,但如果不加保护,可能带来以下问题:

  1. 随意调用:类外代码可以在任何时候调用委托,这可能在错误的时间触发不应发生的行为。

    public class HealthSystem
    {
        public UnityAction OnHealthLow;  // 委托,可以被外部代码赋值和调用
    
        public void CheckHealth(int health)
        {
            if (health < 20)
            {
                OnHealthLow?.Invoke();  // 触发委托
            }
        }
    }
    
    public class Game
    {
        public static void Main()
        {
            HealthSystem healthSystem = new HealthSystem();
    
            // 在健康系统外部肆意玩弄里面的委托变量,里面现有的委托被任意修改
            healthSystem.OnHealthLow = () => { Console.WriteLine("Health is low!"); };
    
            // 正常的调用健康系统里的委托
            healthSystem.CheckHealth(10);  // 输出: "Health is low!"
    
            // 外部代码可以随意调用健康系统里的public委托,委托像极了一个变量
            healthSystem.OnHealthLow();  // 输出: "Health is low!"  // 错误触发
        }
    }
  2. 覆盖或替换类外部代码可以替换委托的内容,导致原本绑定的回调被覆盖,影响程序的正确性和稳定性。如果程序中某个委托本应绑定特定方法,但外部代码替换了它,可能导致逻辑错误。

有了事件的保护后

public class HealthSystem
{
    public event UnityAction OnHealthLow;  //在前面加上event,委托就此支棱

    public void CheckHealth(int health)
    {
        if (health < 20)
        {
            OnHealthLow?.Invoke();  // 触发事件(也就是在健康系统里更硬气了的委托)
        }
    }
}

public class Game
{
    public static void Main()
    {
        HealthSystem healthSystem = new HealthSystem();

        // 外部只能给事件添砖加瓦,不能动里面已有的
        healthSystem.OnHealthLow += () => { Console.WriteLine("Health is low!"); };

        // 检查健康
        healthSystem.CheckHealth(10);  // 输出: "Health is low!"

        // 不是健康系统类里的也不准调用事件
        // healthSystem.OnHealthLow();  // 这行代码会报错,无法直接调用
    }
}

事件的保护机制主要体现在以下两方面:

  1. 触发控制:事件所在的类外,代码不能触发事件,只有定义事件的类内部才能触发它,确保事件只能在合适的时机执行。

  2. 防止覆盖或修改:外部代码不能直接修改或替换事件,只能订阅(+=)或取消订阅(-=),从而防止外部对事件行为的随意更改。

  3. 还有,要是+= lambda表达式这些匿名函数,就赖里面了

这两点保证了事件的安全性和可控性。

在 C# 中,如果你希望一个委托成为事件,你必须在已经声明的委托类型前面加上 event 关键字。这是将委托提升为事件的必要步骤。

委托不仅可以在类内部声明,还可以在类外部声明。

以下是unity里的GUI相关

button会触发方法,这里也是为着更好的保护委托,把委托升级成事件了,

所以在这里 public event UnityAction clickEvent;

 每个组件的都继承GUI的基类组件,如果有关事件触发,就额外增加参数,记录数值的变化

标签:委托,故事,void,悲伤,指令,小强,public,函数
From: https://blog.csdn.net/red_redemption/article/details/142662068

相关文章

  • Vue 事件委托学习
    Vue事件委托学习基本概念与作用什么是事件委托?为什么使用事件委托?示例一:基本的事件委托实现示例二:使用`.self`修饰符示例三:动态绑定事件示例四:使用Vue事件总线使用技巧与分析在前端开发中,处理用户交互是一项重要任务。随着应用复杂度的增加,页面上元素的数量也会随......
  • 通过一个小故事,理解 HTTPS 工作原理
    通过一个小故事,理解HTTPS工作原理 本文摘录参考:细说CA和证书(主要讲解CA的使用)数字签名是什么?(简单理解原理)深入浅出HTTPS工作原理(深入理解原理)HTTP协议由于是明文传送,所以存在三大风险:1、被窃听的风险:第三方可以截获并查看你的内容2、被篡改的危险:第三方可......
  • 【Web APIs day 03 事件流、事件委托、其他事件:优化多个事件绑定和实现常见网页交互】
    WebAPIs-第3天目标:学习事件流,事件委托,其他事件等知识,优化多个事件绑定和实现常见网页交互事件流移除事件监听其他事件元素尺寸与位置综合案例事件流为什么要学习事件流?可以帮我们解决一些疑惑,比如点击子盒子会会弹出2次的问题事件流指的是事件完整执行过程中的......
  • 带着疑问看故事
    packagemwh;importjava.util.Random;publicclassProblem{publicstaticvoidmain(String[]args){Problemmanner=newProblem();for(inti=1;i<=30;i++){manner.problem();}}voidproblem(){Randomr1=newRandom();intnum1=......
  • 社交行业中的数据进化故事:从数据仓库到数据飞轮的技术变革
    在当今数字化时代,数据技术的进化不仅推动了商业模式的革新,还重塑了用户体验。社交行业,作为数据密集和技术驱动的领先行业之一,见证了从简单的数据仓库到动态的数据中台,再到数据飞轮的技术演变。本文将探讨这一行业中数据飞轮如何赋能自动化营销、新用户激励以及全链路营销等业务场景......
  • 【亲子英语】英语故事有声绘本分享
    文章目录一、视觉与听觉的双重盛宴二、语言学习的最佳伙伴三、亲子共读的温馨时光四、适用人群广泛,随时随地学习五、获取方式在这个快速发展的时代,英语学习已经不再局限于课本和课堂。特别是对于活泼好动的孩子们来说,一种既有趣又高效的学习方式显得尤为重要。今天,就......
  • 这是断绝水晶加护的故事!《最终幻想16》风灵月影二十六项修改器功能介绍
    在《最终幻想16》中,风灵月影二十六项修改器的功能介绍吸引着众多玩家。其功能丰富多样且强大,能极大改变游戏体验。但要熟悉每项功能并非易事,可能涵盖角色属性、资源获取等方面。详细了解,让游戏更加随心所欲。《最终幻想16》是一款由SquareEnix开发的角色扮演游戏,以其丰富的......
  • 企业支付宝账户号委托代扣开通步骤?支付宝预授权开通步骤?
    开通企业支付宝账户号委托代扣的步骤通常包括以下几个阶段:(需要开通辅助联系小编)准入条件:确保你的账户类型为支付宝企业账号,并且准备好相关的营业执照和其他必要材料 。签约流程:登录支付宝开放平台,搜索“支付宝预授权”并选择开通服务。根据提示填写相关信息并提交申请 。技......
  • 日入300+,民间诡异故事玩法,简单冷门流量大
    民间诡异故事一直以来都是一个受欢迎的题材,随着中视频计划的兴起,创作者能够轻松获得收益,尤其是播放量高的视频,常常能带来可观的收入。对于新手来说,入门门槛相对较低,竞争又不激烈。教程下载:百度网盘链接https://pan.baidu.com/s/1qJAU9nYHyGn65RHtpAGCvw?pwd=6666大纲:1.项目......
  • 社交行业中的数据进化故事:从数据仓库到数据飞轮的技术变革
    在当今数字化时代,数据技术的进化不仅推动了商业模式的革新,还重塑了用户体验。社交行业,作为数据密集和技术驱动的领先行业之一,见证了从简单的数据仓库到动态的数据中台,再到数据飞轮的技术演变。本文将探讨这一行业中数据飞轮如何赋能自动化营销、新用户激励以及全链路营销等业务场景......