c# 工厂模式 ,委托 ,事件。

摘要:
有时不使用C#。如果你想写代表团和活动,你会陷入困境。我以前没有仔细总结过。然而,这将导致随机输入也符合要求的工厂模式。工厂模式在对象级别是延迟的和多态的。该事件仅限于包含该事件的类。均为生产委托对象。

有些时间 不用 c#了 ,想 写 委托 和 事件 又会 卡下 ,之前也没认真总结过。干脆 做个小结 。

什么是委托:狭义,不安全函数的指针。不安全在哪里: 任何地方都可以调用委托对象。(实际上委托对象才是函数的指针,而delegate只是一个语法

什么是事件:狭义,安全的函数指针,安全在哪里:只允许包含事件的类,的内部调用。

联系和区别:

delegate关键字类比于class关键字, 定义的是一种委托类型,需要再创建委托对象.

用event关键字来修饰创建委托对象行为,那么就成了一个特殊的委托对象,就是事件 。

所以delegate是类,event是修饰语,好比private.

光板 delegate对象,可以到处调用它。event 修饰的delegate对象,只能在  “event 修饰的delegate对象” 所属类中使用。

还有一点语法糖,event只允许+=,而不支持=.因为=,可能会在你需要添加的时候,写成=,会覆盖掉之间的方法。

写完,终于感觉好点了。 

委托 :

1.概念:个人 理解 ,加强版的 函数指针,可以存放多个函数 指针 ,算是函数指针集合。但是提供了异步的高级特性(另开一个线程去调用这个函数指针)

2。 用途:需要对某个方法进行多态或延迟执行的情况下。表现在某个固定模块,先写好函数意图,实现由模块外定义和修改。而固定模块不修改代码。

                 但会导致同样满足要求的工厂模式乱入,区分,工厂模式是在对象级别的延迟和多态。而委托是方法级别的延迟和多态。

3.常用用法举例:处理消息模块(固定模块),模块编写处理流程。具体哪个方法处理或哪几个方法处理 ,由外部定义实现 。

4.缺点:委托无限制,可以直接在任何地方,使用委托对象,进行调用。而事件,限制在包含事件的类内部。

4.简介使用:一个类A里面定义delegate,并定义delegate对象,那么类A的方法FUNB就可以把delegate对象当作函数一样调用。

                    主函数 给 类A的对象中的delegate对象,附加上和delegate原型相同的函数名FUNC。那么主函数,就可以调用A的方法FUNB。 而最终是调用附加上的FUNC方法。

class KernelModule//固定模块,内部成员必须要有委托(函数指针),来表达意图,而实现来自于外部。
    {
        public delegate string PMSGHandle(string msg);//需要一个函数指针
        public PMSGHandle impHandle;//函数指针对象
        public void ProcessMsg(string msg)
        {
        //一些流程

        if (impHandle != null)
        {

              //impHandle(msg);//调用函数指针来调用模块外方法。
              impHandle.BeginInvoke(msg, callbacka, "info");//特性,提供异步调用,并提供回调函数。我去。c#真是逆了天了。使用起来真方便。
       }
} public void callbacka(System.IAsyncResult iar) { //获取绑定函数的引用 AsyncResult ar = (AsyncResult)iar; PMSGHandle delBp = (PMSGHandle)ar.AsyncDelegate; //等待函数执行完毕 string result = delBp.EndInvoke(iar); Console.Write("callback ret:"+ result); } } class Program { static string pmsg(string msg)//意图的实现1 { Console.Write("process fun1:" + msg + Environment.NewLine); return "pmsg do it"; } static string pmsg2(string msg)//意图的实现2 { Console.Write("process fun2:" + msg + Environment.NewLine); return "pmsg2 do it"; } static void Main(string[] args) { string recvMsg = "0101"; KernelModule myKernel = new KernelModule();//创建模块对象。 myKernel.impHandle = pmsg2;//给模块的委托赋值(把函数指针传递)。 //myKernel.impHandle += pmsg;//委托的特性,可以多路委托。(异步调用只能由一个委托对象) myKernel.ProcessMsg(recvMsg);//调用模块对象的方法。
            // myKernel.impHandle(recvMsg);//编译 通过,对于大多数面向对象设计框架下情况下。非常危险。因为委托一般是在类内部,调用的。
            Thread.Sleep(2000); } }

 2.事件

        概念:对委托的实例化提供了一些限制的一种语法 。public event PMSGHandle impHandle    public  PMSGHandle impHandle 。2个语句。都是生产委托对象。但是加了event后。这个对象进行了一些安全操作限制。

        用途:跟委托一样。

   小结:外部调用事件,会有编译错误。KernelModule.impHandle”只能出现在 += 或 -= 的左边(从类型“KernelModule”中使用时除外) 

  举例:

class KernelModule//固定模块,内部成员必须要有委托(函数指针),来表达意图,而实现来自于外部。
    {
        public delegate string PMSGHandle(string msg);//需要一个函数指针
        public event PMSGHandle impHandle;//多写一个event关键字。生成一个event对象,而不是一个delegate对象。
        //public PMSGHandle impHandle;//函数指针对象
        public void ProcessMsg(string msg)
        {
       if (impHandle != null)
        {   impHandle(msg);
//调用函数指针来调用模块外方法。   //impHandle.BeginInvoke(msg, callbacka, "info");//特性,提供异步调用,并提供回调函数。我去。c#真是逆了天了。使用起来真方便。
        }
} public void callbacka(System.IAsyncResult iar) { //获取绑定函数的引用 AsyncResult ar = (AsyncResult)iar; PMSGHandle delBp = (PMSGHandle)ar.AsyncDelegate; //等待函数执行完毕 string result = delBp.EndInvoke(iar); Console.Write("callback ret:"+ result); } } class Program { static string pmsg(string msg)//意图的实现1 { Console.Write("process fun1:" + msg + Environment.NewLine); return "pmsg do it"; } static string pmsg2(string msg)//意图的实现2 { Console.Write("process fun2:" + msg + Environment.NewLine); return "pmsg2 do it"; } static void Main(string[] args) { string recvMsg = "0101"; KernelModule myKernel = new KernelModule();//创建模块对象。 myKernel.impHandle += pmsg2;//给模块的事件handle添加event,不能再使用=号了(把函数指针传递)。 myKernel.impHandle += pmsg;//委托的特性,可以多路委托。(异步调用只能由一个委托对象) myKernel.ProcessMsg(recvMsg);//调用模块对象的方法。
      myKernel.impHandle(recvMsg);//编译错误 KernelModule.impHandle”只能出现在 += 或 -= 的左边(从类型“KernelModule”中使用时除外)  Thread.Sleep(2000); } }

免责声明:文章转载自《c# 工厂模式 ,委托 ,事件。》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue中的一些用法,持续更新中......oracle分组后取某组中最大的值下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)

iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例) 实现了以下iOS页面间传值:1.委托delegate方式;2.通知notification方式;3.block方式;4.UserDefault或者文件方式;5.单例模式方式;6.通过设置属性,实现页面间传值 在iOS开发中,我们经常会遇到...

ZK框架笔记5、事件

        事件是org.zkoss.zk.ui.event.Event类,它通知应用程序发生了什么事情。每一种类型的事件都由一个特定的类来表示。         要响应一个事件,应用程序必须为事件注册一个或更多事件监听器。有3种方式可以为一个组件事件监听器。   (1)一般制定onXXX事件监听器为组件的属性,作为属性定义的事件监听器。 &...

CDHtmlDialog探索----Javascript与窗体交互

CDHtmlDialog探索----Javascript与窗体交互 CDHtmlDialog提供了C++与网页的双向交互,通此一系统简单的宏调用可以把网页中各元素的事件直接映射到C++程序中,而在网页中调用C++功能代码就显的不那么直观了。归根结底交互的基理就是实现相应COM接口。实现方式如下: 1、在窗体初始化时调用EnableAutomation函数...

gprof——GNU性能分析工具

gprof介绍 gprof是GNU profiler工具。可以显示程序运行的“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间。也可以显示“调用图”,包括函数的调用关系,每个函数调用花费了多少时间。还可以显示“注释的源代码”,是程序源代码的一个复本,标记有程序中每行代码的执行次数。 为gprof编译程序 在编译或链接源程序的时候...

linux系统下信号具体解释2

信号是UNIX 系统所使用的进程通信方法中,最古老的一种。信号不但能从内核发往一个进程,也能从一个进程发往还有一个进程。比如,用户在后台启动了一个要运行较长时间的程序,假设想中断其运行,能够用kill 命令把SIGTERM信号发送给这个进程,SIGTERM 将终止此进程的运行。信号还提供了向UNIX 系统进程传送软中断的简单方法。信号能够中断一个进程,而...

原生JS编写图片切换效果和点击按钮的样式变化

  这两天更进一步的了解了JS,老师让我们用原生的js编写图片切换和改变点击按钮样式,就是让我们学会怎么去把一个问题拆分,怎么将一个大问题拆分成许多的小问题,再用函数封装起来。比如一个点击按钮,让其点击时背景色发生改变,点击另一个时,上一个按钮要变回原来本有的颜色:这个问题用jquery,一行代码就搞定,但是用原生js就得分三个部分来考虑:   1.添加改...