C#事件实例详解

所属分类: 软件编程 / C#教程 阅读数: 73
收藏 0 赞 0 分享

C#事件实例详解

C#和JAVA有许多相似的地方,设计思想差不多,语法及其相像,均传承自面向对象设计思想,灵感来自C++并取其精华去其“糟粕(二字持保留意见)”,中间语言、解释执行、一次编译、到处执行,出身豪门算得上是表兄弟关系,各自拥有庞大的拥趸,两种语言在发展的道路上你追我赶相互借鉴相互学习相互渗透,至于谁的IDE更强大对于一个用了二十年vim编辑器的人来说实在无从评判,强大到让人内牛满面~

    C#语言中关于事件(event)结合代理(delegate)实现对象状态变更时的通知机制,总感觉这种处理有点过于复杂化了,但既然人家这么设计必定有人家的道理,相信并向人家学习而不急于批判和否定才能让自己进步的更快,个人觉得这种处理大概是来自于视窗系统独有的对各个控件事件集中快速响应的机制吧,这可能也是从事前后端开发关注点的差异,前端重人机交互当然交互的核心就是不确定时间属性和状态的事件,后端重触发每个事件的发生基本都是预定义且流程化构建好的,所以接下来尝试理解和解读一下C#的事件。

    第一步:声明一个代理,这个代理可以是系统的也可以是自定义的。

 public delegate void MyDelegate();                   // 声明无参无返回值代理

  public delegate bool MyDelegate(int k, int v);         // 声明有参有返回值代理

    第二步:创建一个包含该代理事件的对象,对象中调用代理实现事件的处理。

  public class MyArrayList : ArrayList

  {

    public event MyDelegate MyChanged;           // 声明代理事件

    public override void Add(object o)                // 覆盖父类方法

    {

       base.Add(o);                              // 调用父类方法

      OnChanged();                             // 调用事件函数

    }

    protected virtual void OnChanged()

    {

      if (null != MyChanged) MyChanged();        // 代理触发事件

    }

  }

    第三步:创建一个类,将事件和代理绑定到一起,a、类构造时以包含代理事件对象作为入参,b、“+=”运算符实现绑定,c、在代理中传入类成员函数。

 public class MyEvent

  {

    private MyArrayList list;

    public MyEvent(MyArrayList l)

    {

      list = l;

      list.MyChanged += new MyDelegate(ListChanged);    // 绑定事件

    }

    private void ListChanged()                           // 被绑定事件

    {

      System.Console.WriteLine("ListChanged ...");

    }

  }

    第四步:创建含有事件的类的实例,创建含有方法的类的实例。

  public class MyTest

  {

    public static void Main()

    {

      MyEvent me = new MyEvent(new MyArrarList());

      me.Add("object_1");

    }

  }

    仔细研究发现,代理相当于C\C++中的函数指针,但功能更强大,使用更安全,代理实例在创建的时候,代理会把传给它的参数传给绑定的方法,而且代理可以通过“+=”运算符搭载更多的方法,下面是对比C\C++函数指针的用法。

  char* (*pFun)(char*) = NULL;

  pFun = GtCodeUtf8ToGB2312;

  char* pszData = (*pFun)("计算机");

 

  char* GtCodeUtf8ToGB2312(char* pszUtf8)

  {

    char* pszGB2312 = NULL;

    ......

    return pszGB2312;

  }

    再举两个C语言中典型的函数指针的例子:

    例一:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);其中第三个参数是一个函数地址,指向被创建线程的核心处理函数。

    例二:void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));其中最后一个参数也是一个函数地址,指向两个元素对比计算函数。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多精彩内容其他人还在看

C#获取并修改文件扩展名的方法

这篇文章主要介绍了C#获取并修改文件扩展名的方法,实例分析了C#编程方式修改文件扩展名的技巧,涉及Path类的使用方法,需要的朋友可以参考下
收藏 0 赞 0 分享

C#遍历操作系统下所有驱动器的方法

这篇文章主要介绍了C#遍历操作系统下所有驱动器的方法,涉及C#中DriveInfo类GetDrivers方法的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#遍历指定目录下所有文件的方法

这篇文章主要介绍了C#遍历指定目录下所有文件的方法,实例分析了C#中GetFiles()方法遍历文件的使用技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#拷贝文件简单实现方法

这篇文章主要介绍了C#拷贝文件简单实现方法,主要分析了FileInfo类中CopyTo方法针对文件复制的操作技巧,非常简单实用,需要的朋友可以参考下
收藏 0 赞 0 分享

C#获取文件相关信息的方法

这篇文章主要介绍了C#获取文件相关信息的方法,涉及C#中FileInfo类的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#交错数组用法实例

这篇文章主要介绍了C#交错数组用法,较为详细的分析了交错数组的概念、用法并实例分析了交错数组的使用技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#实现在前端网页弹出警告对话框(alert)的方法

这篇文章主要介绍了C#实现在前端网页弹出警告对话框(alert)的方法,涉及C#通过自定义函数调用window.alert方法弹出对话框的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#实现控制Windows系统关机、重启和注销的方法

这篇文章主要介绍了C#实现控制Windows系统关机、重启和注销的方法,涉及C#调用windows系统命令实现控制开机、关机等操作的技巧,非常简单实用,需要的朋友可以参考下
收藏 0 赞 0 分享

C#读取Excel并转化成XML的方法

这篇文章主要介绍了C#读取Excel并转化成XML的方法,实例分析了C#操作Excel及XML文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#创建一个Word并打开的方法

这篇文章主要介绍了C#创建一个Word并打开的方法,实例分析了C#操作word的常用技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多