C#事件实例详解

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 *));其中最后一个参数也是一个函数地址,指向两个元素对比计算函数。

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

(0)

相关推荐

  • C#自定义事件监听实现方法

    本文实例讲述了C#自定义事件监听实现方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApp { /// <summary> /// 定义事件 /// </summary> class CustomEvent { /// <summary> /// 定义委托 /// &

  • C#3.0使用EventLog类写Windows事件日志的方法

    本文实例讲述了C#3.0使用EventLog类写Windows事件日志的方法.分享给大家供大家参考.具体如下: 在程序中经常需要将指定的信息(包括异常信息和正常处理信息)写到日志中.在C#3.0中可以使用EventLog类将各种信 息直接写入Windows日志.EventLog类在System.Diagnostics命名空间中.我们可以在"管理工具" > "事件查看器"中 可以查看我们写入的Windows日志 下面是一个使用EventLog类向应用程序(App

  • C# 实现与现有.NET事件桥接简单实例

    C# 实现与现有.NET事件桥接简单实例 Rx提供了工厂方法,以便与.NET中的现有异步源桥接,以便您可以使用由任何类型的数据流提供的丰富的组合,过滤和资源管理功能. 本主题检查FromEventPattern运算符,它允许将.NET事件作为可观察序列"导入"到Rx中. 每次引发事件时,OnNext消息将被传递到可观察的序列. 然后,您可以像任何其他可观察序列一样处理事件数据. Rx并不旨在替换现有的异步编程模型,如.NET事件,异步模式或任务并行库. 但是,当您尝试编写事件时,Rx的

  • 浅谈C#中的委托、事件与异步

    从刚接触c#编程到现在,差不多快有一年的时间了.在学习过程中,有很多地方始终似是而非,直到最近才弄明白. 本文将先介绍用法,后评断功能. 一.委托 基本用法: 1.声明一个委托类型.委托就像是'类'一样,声明了一种委托之后就可以创建多个具有此种特征的委托.(特征,指的是返回值.参数类型) public delegate void SomeKindOfDelegate(string result); 2.创建一个在1中创建的委托类型的委托. public SomeKindOfDelegate aD

  • C#实现给DataGrid单元行添加双击事件的方法

    本文实例讲述了C#实现给DataGrid单元行添加双击事件的方法.分享给大家供大家参考.具体如下: 现在我需要做到的功能是当我单击DataGrid某行时显示相对应选中的数据信息,在双击此相同行时弹出删除对话框,应该怎么做呢.由于单击问题很简单就不再阐述了,下面我说一下双击事件是怎么实现的. 这里用到了DataGrid的ItemDataBound事件,我们可以把下面的代码加入到所需的程序中就可实现双击的功能. private void DataGrid1_ItemDataBound( object

  • 详解C#中委托,事件与回调函数讲解

    .Net编程中最经常用的元素,事件必然是其中之一.无论在ASP.NET还是WINFrom开发中,窗体加载(Load),绘制(Paint),初始化(Init)等等. "protected void Page_Load(object sender, EventArgs e)"这段代码相信没有人不熟悉的.细心一点一定会发现,非常多的事件方法都是带了"object sender, EventArgs e"这两个参数.这是不是和委托非常相似呢? 一.委托(有些书中也称为委派)

  • C#中事件的定义和使用

    事件的声明和使用与代理有很密切的关系,事件其实是一个或多个方法的代理,当对象的某个状态发生了变化,代理会被自动调用,从而代理的方法就被自动执行. 声明和使用一个事件需要如下步骤: 1.创建一个代理. 2.在类的内部利用event关键字声明事件,并且在类中定义调用事件的方法,也可以定义一个处理事件消息的方法. 声明一个事件的基本形式有两种: 修饰符  event   类型   标识符 修饰符  event   类型   标识符{get{};set{};} 其中: 修饰符是指C#语言的访问修饰符:类

  • C#微信公众号开发 微信事件交互

    前言 一切准备工作就绪时就先实现一个关注公众号后向客户端推送一条消息.关注后推送消息需要一个get请求.一个post请求,get请求主要是为了向微信服务器验证,post请求主要就是处理微信消息了. 调接口时传递的appid和appsecret请传递自己公众号对应的参数. 微信事件交互 微信事件交互主要是向微信服务器推送XML数据包 看效果 看代码 [HttpGet] [ActionName("Index")] public ActionResult Get(string signatu

  • 微信小程序之绑定点击事件实例详解

    微信小程序之绑定点击事件实例详解 微信小程序出来那么久了,趁着有时间自己研究一下,前阶段看一了一下,但是不允许个人注册,现在已经对个人开放了,所以爱好者们可以自己研究了. 首先,我们看一下如何添加底部的标签栏:在app.json里操作 { "pages":[ //在这里添加页面的路径 "pages/index/index", "pages/logs/logs", "pages/home/home" ], "windo

  • C#事件实例详解

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

  • 移动web开发之touch事件实例详解

    前面的话 iOS版Safari为了向开发人员传达一些特殊信息,新增了一些专有事件.因为iOS设备既没有鼠标也没有键盘,所以在为移动Safari开发交互性网页时,常规的鼠标和键盘事件根本不够用.随着Android 中的WebKit的加入,很多这样的专有事件变成了事实标准,导致W3C开始制定Touch Events规范.本文将详细介绍移动端touch事件 概述 包含iOS 2.0软件的iPhone 3G发布时,也包含了一个新版本的Safari浏览器.这款新的移动Safari提供了一些与触摸(touc

  • vue鼠标悬停事件实例详解

    具体代码如下所述: v-bind:title="message" <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue实例化</title> </head> <script src="https://cdn.jsdelivr.net/npm/vue/dis

  • Android开发使用RecyclerView添加点击事件实例详解

    目录 引言 一.RecyclerView基本使用 1. 添加适配器Adapter 2. 创建列表的每个项的item_layout.xml文件 3. 在activity中使用 二.RecyclerView点击事件详细步骤 1. 在RecyclerView对应的Adapter类里面新建接口 2. 在Adapter类里创建setOnItemClickListener方法 3. 在Adapter类的onBindViewHolder里给每个item设置回调 4. 在RecyclerView对应的Activ

  • Javascript事件实例详解

    document是位于html标签之上的,可以说是权力最大的.下面的实例当你单击页面上的任何位置都会弹出"a",正是运用了document的特性. 复制代码 代码如下: <script>             document.onclick=function(){         alert('a');     }; </script> 获取鼠标位置clientX,clientY---注意这里仅仅只是可视区的鼠标位置 复制代码 代码如下: <scrip

  • Android编程之滑动按钮事件实例详解

    本文实例讲述了Android滑动按钮事件.分享给大家供大家参考,具体如下: 今天纪录一下滑动按钮功能.. 首先效果图: 然后是分别建立三个文件,第一个是main.class,第二个是SlipButton.class,第三个是 onchangeListener.class main.class import Android.app.Activity; import android.os.Bundle; import android.widget.Toast; public class Main e

  • Python多线程操作之互斥锁、递归锁、信号量、事件实例详解

    本文实例讲述了Python多线程操作之互斥锁.递归锁.信号量.事件.分享给大家供大家参考,具体如下: 互斥锁: 为什么要有互斥锁:由于多线程是并行的,如果某一线程取出了某一个数据将要进行操作,但它还没有那么快执行完操作,这时候如果另外一个线程也要操作这个数据,那么这个数据可能会因为两次操作而发生错误 import time,threading x=6 def run1(): print("run1我拿到了数据:",x) print("我现在还不想操作,先睡一下")

  • JavaFX 监听窗口关闭事件实例详解

    1.写在前面 在JavaFX的程序开发的时候,在使用多线程的时候,默认情况下在程序退出的时候,新开的线程依然在后台运行. 在这种情况下,可以监听窗口关闭事件,在里面关闭子线程. 2.具体实现的样例 package sample; import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import java

  • Android recycleView的应用和点击事件实例详解

    Android recycleView的应用和点击事件 效果图: 长按是删除: 下面代码: MainActivity 类 public class MainActivity extends AppCompatActivity { RecyclerView rv; List<String> mList = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.on

随机推荐