.Net之美读书系列(一):委托与事件

时间:2022-12-09 12:54:42

开启新的读书之旅,这次读的书为《.Net之美:.Net关键技术深入解析》。

我是选择性阅读的,把一些自己觉得容易忘记的,或者比较重要的知识点记录下来,以便以后能方便呢查阅。

尊重书本原作者,如果大家能有个可能的话,去看看这本书,作者写得挺不错的。例子和知识点各方面都写挺不错的。

本章的内容

什么是委托/创建委托类型的写法/事件与委托/发布者和订阅者(观察者模式)

什么是委托:

说白了就是平时我们把变量当参数传递的时候,这个变量的类型可以是int类型,double类型,string类型以及各种自定义引用类型等等,但是有时候,我们需要的把一个方法当作参数传入到另外方法中,这个时候就需要一个容器去存储,这个时候该类型的名称就是成为“委托”。

创建委托类型的写法:

一个普通的方法名:  public  void NomalMenthod(string parameter)

一个方法的委托   :  public delegate void MenthodDelegate(string parameter);

委托与方法有什么不同呢,不同之处就是都了delegate进行修饰,以及不同的名称而已,它们的共同点就是:相同的返回类型,相同的参数。其实,一个委托最终也是编译成一个类。以下标出委托的写法与用法:

        public static void Main(string[] args)
{
//使用委托。传入与委托相同类型的方法作参数
sayhi("猪猪猪扒",ChineseSay);
Console.Read();
}
//1.目的是一个问号的方法,但是各个国家的方式问好方法不相同,在代码层面中需要一个这些方法共同的特点来做一个统一,所以把委托做一个参数
public static void sayhi(string name, MenthodDelegate delegatemethod)
{
delegatemethod(name);
}
//2.定义一个委托类型作为统一的方法的类型
public delegate void MenthodDelegate(string parameter); //3.1这两步都是说明方法是动作不一样而已。
public static void ChineseSay(string name)
{
Console.WriteLine("李好 " + name);
}
//3.2这两步都是说明方法是动作不一样而已。
public static void EnglishSay(string name)
{
Console.WriteLine("Morning " + name);
}

创建一个委托(注意不是创建委托类型),为委托绑定方法,一个委托可以有绑定多个方法,委托的调用

        public static void Main(string[] args)
{
//创建一个委托(传入参数时已经绑定了一个委托了)
MenthodDelegate m = new MenthodDelegate(ChineseSay);
//为委托绑定第二个方法
m += EnglishSay;
//委托的调用方式1
m.Invoke("我是参数");
//委托的调用方式2
m("我是参数");
//为委托取消方法的绑定
m -= EnglishSay; Console.Read();
}

事件与委托

事件就是对委托的封装,如果在一个类中,委托声明为privite,则不能暴露到给类外的,但是又不想该委托直接被赋值修改,所以这个时候就定义了事件。

定义事件的写法:public event MenthodDelegate MenthodEvent;

事件就类似于定义个委托变量,只是多了public修饰符和event,在该类中外部,如果要访问并注册事件时,只能使用“+=”和“-=”。

类中的调用调用直接使用 MenthodEvent()或者MenthodEvent.Invoke()就可以了。

    public class DelegateClass
{
//在类中封装委托为事件
public event MenthodDelegate menthodevent; //调用事件
public void testdelegate(string name)
{
if (menthodevent != null)
{
menthodevent(name);
}
}
} //在另外一个方法中调用
public static void Main(string[] args)
{
DelegateClass dc = new DelegateClass();
//注册事件
dc.menthodevent += EnglishSay;
dc.testdelegate("我是参数"); Console.Read();
}

发布者和订阅者(观察者模式)

发布者表示发布事件的代码,就是供订阅者在事件上使用+=来注册事件的一方,通俗一点的意思就是:发布事件的代码;订阅者就是订阅事件的一方,就是使用+=中右边的方法,理解为订阅事件的代码;

如果没有事件event进行封装,那么在类的外部,创建了类的对象后,可以随意触发事件,对于订阅事件来说是一件极其不利的事件,所以事件更好地实现了发布者和订阅者的模式。

至今我还是觉得观察者模式和发布者模式一个概念,只是说法上不一样而已,观察者就是订阅事件的人,而被观察者就是发布事件的人.

Observer设计模式:Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新。Observer模式是一种松耦合的模式.

观察者模式:

        public static void Main(string[] args)
{
//被观察者
Heater heater = new Heater(); //注册事件
heater.Boiled += (new ConsoleApplication1.Alarm()).MakeAlert;
heater.Boiled += (new ConsoleApplication1.Display()).ShowMsg; //就是此触发事件的
heater.BoilWater();
Console.Read();
}
public class Heater
{
public string type = "RealFire 001";
public string area = "China Xian";
private int temperture;//水温
public delegate void BoiledEventHandler(Object sender, BoiledEventArgs s);
public event BoiledEventHandler Boiled; //3.在观察对象想传递它自身属性属性给观察者,这时候就需要另外构建一个参数类型,就是此类型了.
public class BoiledEventArgs : EventArgs
{
public readonly int temperature;
public BoiledEventArgs(int temperature)
{
this.temperature = temperature;
}
} //2.这里是执行触发的事件操作的代码
protected virtual void OnBoiled(BoiledEventArgs e)
{
if (Boiled != null)
{
Boiled(this, e);
}
} //1.此方法是被观察对象的触发事件的代码,在什么情况下触发事件由此方法决定
public virtual void BoilWater()
{
for (int i = ; i < ; i++)
{
temperture = i;
if (temperture > )
{
//构造参数-->分别为第3步
BoiledEventArgs args = new BoiledEventArgs(temperture);
//调用操作委托的方法--->第2步
OnBoiled(args);
}
}
}
} //观察者1
public class Alarm
{
/// <summary>
/// 观察者需要执行的方法的参数由观察对象提供
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void MakeAlert(Object sender,Heater.BoiledEventArgs e)
{
Console.WriteLine("现在" + e.temperature + "度");
}
} //观察者2
public class Display
{ /// <summary>
/// 观察者所需要做的操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e">类型由观察对象提供,参数对象只需要获取可以了</param>
public void ShowMsg(Object sender, Heater.BoiledEventArgs e)
{
Console.WriteLine(" Display: 水快开了, 当前温度:{0} 度。", e.temperature);
}
}

以上就是观察者模式以及一些自我的了解,.net自带的委托写法也是按照以上的格式.其中一些规范如下:

  • 委托类型的名称都应该以EventHandler结束。
  • 委托的原型定义有一个void返回值,并接受两个输入参数:一个Object类型,一个EventArgs类型( 或继承自 EventArgs)
  • 事件的命名为委托去掉EventHandler之后剩余的部分。
  • 传入事件的参数的应该继承自EventArgs,并且以此结尾.

我是把委托简单理解为4种操作。

1.创建委托类型
2.创建委托变量(封装了就叫事件)
3.为委托变量注册方法
4.委托的调用
5.直接把方法当作参数使用

.Net之美读书系列(一):委托与事件的更多相关文章

  1. &period;Net之美读书系列&lpar;二&rpar;&colon;委托进阶

    这次看书的知识点: 事件访问器 如果一个委托中注册了多个事件且需要获取其返回值的方法 委托的异常处理 委托处理超时的方法 异步委托 事件访问器 职能有: 1.对委托属性进行封装,不再直接该委托变量直接 ...

  2. &period;NET面试题系列&lbrack;7&rsqb; - 委托与事件

    委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...

  3. C&num; 基础知识系列- 11 委托和事件

    0. 前言 事件和委托是C#中的高级特性,也是C#中很有意思的一部分.出现事件的地方,必然有委托出现:而委托则不一定会有事件出现.那为什么会出现这样的关系呢?这就需要从事件和委托的定义出发,了解其中的 ...

  4. &lbrack;转&rsqb;大白话系列之C&num;委托与事件讲解&lpar;三&rpar;

    本文转自:http://www.cnblogs.com/wudiwushen/archive/2010/04/21/1717378.html [我希望大家在看完文章的时候,多做做练习,自己也可以想个场 ...

  5. 大白话系列之C&num;委托与事件讲解&lpar;一&rpar;

    从序言中,大家应该对委托和事件的重要性有点了解了吧,虽然说我们现在还是能模糊,但是从我的大白话系列中,我会把这些概念说的通俗易懂的.首先,我们还是先说说委托吧,从字面上理解,只要是中国人应该都知道这个 ...

  6. 《C&num;从现象到本质》读书笔记(六)第8章委托和事件

    <C#从现象到本质>读书笔记(六)第二部分 C#特性 第8章委托和事件 从这一部分开始,知识点就相对少了,重要的是代码练习.奈何太高深的代码平常不怎么用,这些特性也不是经常写代码的. 委托 ...

  7. 委托、Lambda表达式、事件系列06&comma;使用Action实现观察者模式,体验委托和事件的区别

    在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式,并从中体验委托与事件 ...

  8. 委托、Lambda表达式、事件系列04&comma;委托链是怎样形成的&comma; 多播委托&comma; 调用委托链方法,委托链异常处理

    委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链.本篇的话题包括:委托链是怎样形成的,如何调用委托链方法,以及委托链异常处理. □ 调用返回类型为 ...

  9. 委托、Lambda表达式、事件系列01&comma;委托是什么&comma;委托的基本用法&comma;委托的Method和Target属性

    委托是一个类. namespace ConsoleApplication1 { internal delegate void MyDelegate(int val); class Program { ...

随机推荐

  1. 转《WF编程》笔记目录

    <WF编程>笔记目录 2008-03-18 09:33 by Windie Chai, 26803 阅读, 49 评论, 收藏, 编辑 WF笔记开始 <WF编程>系列之0 - ...

  2. 设计前沿:25个设计师向您展示 iOS 7 界面

    我们中的许多人都对新发布的 iOS 7 用户界面有点失望.扎眼的颜色搭配,难看的图标和可疑的设计决策,导致很多的设计师在 Dribbble 和 Behance 等社交网站分享自己对 iOS 界面设计的 ...

  3. DEDECMS网站数据备份还原教程

    备份织梦网站数据 dedecms备份教程 进入DedeCms后台 -> 系统 -> 数据库备份/还原 备份文件在\data\backupdata 下载数据库备份资料\data\backup ...

  4. leetcode 题解&colon;Binary Tree Preorder Traversal (二叉树的先序遍历)

    题目: Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binar ...

  5. Backbone&period;js学习之View

    千呼万唤始出来,终于到最后一个要点View了.照旧,先来一睹官方文档: Backbone views are almost more convention than they are code - t ...

  6. python类库26&lbrack;web2py之基本概念&rsqb;

    一 web2py的应用的执行环境Models,Controllers和views所在的执行环境中,以下对象已经被默认地导入: Global Objects:  request,response,ses ...

  7. 彩色图像--色彩空间 CMY&lpar;K&rpar;场地

    得知DIP文章63日 转载请注明文章出处:http://blog.csdn.net/tonyshengtan .出于尊重文章作者的劳动,转载请标明出处!文章代码已托管.欢迎共同开发:https://g ...

  8. Selenium Grid2

    简介 使用selenium-grid可以远程执行测试的代码,核心步骤:grid --> server-->chromedriver驱动 -->chrome浏览器 利用Selenium ...

  9. storm从入门到放弃&lpar;一&rpar;,storm介绍

    背景:目前就职于国内最大的IT咨询公司,恰巧又是毕业季,所在部门招了100多个应届毕业生,本人要跟部门新人进行为期一个月的大数据入职培训,特此将整理的文档分享出来. 原文和作者一起讨论:http:// ...

  10. 【 HDU 4936 】Rainbow Island (hash &plus; 高斯消元)

    BUPT2017 wintertraining(15) #5B HDU - 4936 2014 Multi-University Training Contest 7 F 题意 直接看官方的题意和题解 ...