C#笔记进阶篇07 事件

C#笔记进阶篇07 事件

——本系列是基于人民邮电出版社《C#2008 C#图解教程》、清华大学出版社《C#入门经典(第五版)》两本书的自学C#笔记,如果您发现了本文的纰漏,还望不吝指正。

写在前边

事件的很多方面和委托相似。事件就好像被简化的针对特殊用途的委托。——人民邮电出版社《C#2008 C#图解教程》

*复习:类是一种能存储数据并执行代码的数据结构,它包含:

  • 数据成员——存储数据
    包括:字段、常量
  • 函数成员——执行代码
    包括:方法,属性,构造函数,索引,运算符,事件,析构函数

在之前基础篇的笔记中:

C#笔记10 类:基础
C#笔记11 类:类成员补充01
C#笔记12 类:类成员补充02

已经介绍了九种类成员类型中的七种(字段,方法,常量,属性,索引,构造函数和析构函数)

1. 事件的定义

事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。——菜鸟教程

  • 事件只负责告诉每个函数什么时候被调用,这些函数到底干了什么,事件并不关心
  • C# 中使用事件机制实现线程间的通信

1.1 事件包含了一个私有的委托

  • 事件提供了对它的私有控制委托的结构化访问
  • 对于事件我们只可以添加、删除或调用事件处理程序
  • 事件触发时,它调用委托来依次调用调用列表中的方法

1.2 事件中使用的代码

7-1

  • 委托类型声明:事件和事件处理程序必须有共同的签名和返回类型,它们通过委托类型声明进行描述。
  • 事件处理程序声明:这些在订阅者类的方法(事件处理程序)中的描述会在事件触发时被执行。它们不需要有独立的方法,它们可以是匿名方法或lambda表达式。
  • 事件声明:这个事件发布者类中的声明保存并调用事件处理程序。
  • 事件注册:这段代码把事件连接到事件处理程序。
  • 触发事件的代码:发布者类中的这段代码调用事件导致它调用事件处理程序。

1.3 事件基本处理过程

订阅 -> 发布 -> 执行

  • 首先,应用程序创建一个可以引发事件的对象。当满足条件时,这个对象会引发一个事件。
  • 接着,应用程序订阅事件,定义一个方法,该方法可以与事件指定的委托类型一起使用,把这个方法的一个引用传送给事件
  • 引发事件后,就通知订阅器,调用对象上的事件处理方法

2. 事件的声明

事件的本质是成员,必须声明在类或结构中

  • 由于事件不是类型,我们不能使用对象创建表达式(new表达式)来创建它的对象
  • 事件成员被隐式自动初始化为null

1).在类的内部声明事件,首先必须声明该事件的委托类型。例如:

public delegate void BoilerLogHandler(string status);

2).然后,声明事件本身,使用 event 关键字

//基于上面的委托定义事件
public event BoilerLogHandler BoilerEventLog;
//声明为public,其他类和结构可以在上边注册事件处理程序

上面的代码定义了一个名为 BoilerLogHandler 的委托和一个名为 BoilerEventLog 的事件,该事件在生成的时候会调用委托。

*可以通过使用逗号分隔的列表在一个声明语句中声明一个以上的事件。还可以使用static关键字让事件变成静态的

例:下面语句声明了三个事件

public event BoilerLogHandler MyEvent1, MyEvent2, OtherEvent;

例:下面语句声明静态的事件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
封装是面向对象编程中的一种重要概念,它允许我们将数据和方法封装在一个类中,并通过访问修饰符来控制对这些成员的访问权限。在C#中,我们可以使用访问修饰符(public、private、protected等)来定义类的成员的访问级别。 封装的目的是隐藏类的内部实现细节,同时提供公共接口供其他代码进行访问。这样可以提高代码的可维护性和安全性,并且能够实现代码的重用。 在C#中,封装有以下几个方面的进阶知识: 1. 属性(Properties):属性是一种特殊的方法,用于控制对私有字段的访问。通过使用属性,我们可以在外部代码中通过属性名称来读取或修改私有字段的值,而不需要直接访问字段本身。 2. 索引器(Indexers):索引器允许我们通过类似于数组的方式来访问对象的元素。通过定义索引器,我们可以提供更加灵活和方便的访问方式,使得对象可以像数组一样进行索引和赋值操作。 3. 接口(Interfaces):接口是一种定义了一组方法、属性和事件的类型。通过实现接口,我们可以定义类与其他类之间的契约关系,实现代码的解耦和灵活性。 4. 抽象类(Abstract Classes):抽象类是一种不能被实例化的类,用于定义一组相关的具体类的公共行为和属性。抽象类可以包含抽象方法和具体方法,子类必须实现抽象方法才能被实例化。 5. 泛型(Generics):泛型允许我们编写可以在多种类型上进行操作的代码,提高代码的重用性和性能。通过使用泛型,我们可以编写出更加通用和灵活的类和方法。 以上是C#中封装的基础知识和进阶知识,掌握这些知识可以帮助我们编写更加优雅和高效的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值