博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
delegate 与 event 不得不说的关系~
阅读量:4310 次
发布时间:2019-06-06

本文共 1833 字,大约阅读时间需要 6 分钟。

先来看一段代码:

///     /// 事件类    ///     public class EventClass    {        ///         /// Go委托        ///         ///         public delegate void Go(string nam);        ///         /// 事件委托        ///         public event Go GoEvent;        ///         /// 方法1        ///         ///         public void GoFun(string name)        {            Console.WriteLine(name);        }        ///         /// 方法2        ///         ///         public void GoFun2(string name)        {            Console.WriteLine(name + "fun2");        }        ///         /// 测试方法        ///         public void Test()        {            //event 无须new初始化            Go += GoFun; //error            GoEvent += GoFun; //success            Go go = new Go(GoFun); //success            GoEvent += GoFun2; //success            go += GoFun2; //success            //执行 - 结果一致(无区别)            GoEvent("test");            go("test");        }    }

可以看到,delegate 与 event 其实差不多,就是区别于初始化的问题。

我们再来看一组代码:

class Program    {        static void Main(string[] args)        {            EventClass e = new EventClass();            e.GoEvent += e.GoFun;            e.GoEvent += e.GoFun2;            EventClass.Go go = new EventClass.Go(e.GoFun);            go += e.GoFun2;            //执行            //错误    1    事件“EventClass.GoEvent”只能出现在 += 或 -= 的左边(从类型“EventClass”中使用时除外)            e.GoEvent("test2"); // error             go("test2"); //success            Console.WriteLine("done.");             Console.ReadKey();        }    }

可以看到区别出来了:event在外部只能使用 += 或 -= 操作。

/*     * 当有event关键字时,程序能运行正常。我把event去掉,程序也一样能运行正常。      * event只不过是限制'委托实例对象'的能力用的,是委托的子集。     * 如:事件只能进行+、-  不能直接Func(......)。而我取掉event之后,就可以直接用了。     */

再来看看反编译会的结果:

可以看到图

Go 委托 依然有调用的方法

event 事件 只存在 add 和 remove方法

event通过对delegate的限制来封装一部分本来就不应该暴露在外的行为

转载于:https://www.cnblogs.com/soneltd/p/4756766.html

你可能感兴趣的文章
操作数据库出现InvalidOpertionException(内部连接致命错误)
查看>>
深入ASP.NET数据绑定(中)——数据双向绑定机理
查看>>
Toolbar使用
查看>>
mysql优化
查看>>
线程的几种创建方式
查看>>
免费的Bootstrap等待页面的应用模板
查看>>
JS DOM操作(四) Window.docunment对象——操作内容
查看>>
machine learning 之 Recommender Systems
查看>>
新房装修三大空鼓解决方法 为家居装修做好前奏
查看>>
vue.js路由vue-router
查看>>
小程序丨页面去掉转发按钮
查看>>
判断浏览器类型和版本
查看>>
kafka入门介绍
查看>>
[POI2011]SEJ-Strongbox
查看>>
5.学习资源
查看>>
IOS错误总结
查看>>
Win10系列:C#应用控件进阶4
查看>>
std::remove_if
查看>>
前端学HTTP之报文首部
查看>>
设置IIS 兼容32位DLL
查看>>