C# 委托 应用实例

用一句话解释委托:委托是一种可以把引用存储为函数的类型。

有些类似Spring框架对于接口的用法,向Action中注入Service对象。Action并不知道调用哪个服务层,只有容器通过配置文件

向Action注入Service对象后,Action才能知道调用的是哪个实现的服务层对象。

你传入的是那个实现类,我就执行哪个实现类的方法。

从网上搜得一段说明,帮助理解:

委托和接口都允许类设计器分离类型声明和实现。给定的接口可由任何类或结构继承和实现;

可以为任何类中的方法创建委托,前提是该方法符合委托的方法签名。接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。

分析下面例子:首先对于一个热水器对象来说,他满足一定条件的时候需要触发一个事件(委托),但这个事件不那么确定或者不只调用一个方法。

那么我们就在这个对象中声明一个委托方法:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 namespace Delegate
 5 {
 6     // 热水器
 7     public class Heater
 8     {
 9         private int temperature;
10         public delegate void BoilHandler(int param); //声明委托
11         public event BoilHandler BoilEvent; //声明事件
12         // 烧水
13         public void BoilWater()
14         {
15             for (int i = 0; i <= 100; i++)
16             {
17                 temperature = i;
18                 if (temperature > 95)
19                 {
20                     if (BoilEvent != null)
21                     { //如果有对象注册
22                         BoilEvent(temperature); //调用所有注册对象的方法
23                     }
24                 }
25             }
26         }
27     }
28 }

然后,再定义处理这个事件的一些方法:

1 // 警报器
2 public class Alarm
3 {
4     public void MakeAlert(int param)
5     {
6         Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", param);
7     }
8 }
1 // 显示器
2 public class Display
3 {
4     public static void ShowMsg(int param)
5     { //静态方法
6         Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", param);
7     }
8 }

好了,一切准备好,我们利用注册事件,调用这些委托的方法:

 1 class Program
 2 {
 3     static void Main()
 4     {
 5         Heater heater = new Heater();
 6         Alarm alarm = new Alarm();
 7         heater.BoilEvent += alarm.MakeAlert; //注册方法
 8         heater.BoilEvent += (new Alarm()).MakeAlert; //给匿名对象注册方法
 9         heater.BoilEvent += Display.ShowMsg; //注册静态方法
10         heater.BoilWater(); //烧水,会自动调用注册过对象的方法
11     }
12 }

输出为:

Alarm:嘀嘀嘀,水已经 96 度了:

Alarm:嘀嘀嘀,水已经 96 度了:

Display:水快烧开了,当前温度:96度。

时间: 2024-10-06 19:49:06

C# 委托 应用实例的相关文章

iOS 循环引用 委托 (实例说明)

如何避免循环引用造成的内存泄漏呢: 以delegate模式为例(viewcontroller和view之间就是代理模式,viewcontroller有view的使用权,viewcontroller同时也是view的代理(处理view中的事件)): UserWebService.h #import //定义一个ws完成的delegate @protocol WsCompleteDelegate @required -(void) finished;//需要实现的方法 @end @interface

C#委托和事件的实例讲解

using System; namespace delegate_event { // 定义一个猫类 class Cat { // 定义一个名字字段 private string name; // 创建构造函数,参数为string,给小猫一个初始的名字 // 如果初始化的时候不写名字会报错,除非再写一个重载 public Cat (string name) { this.name = name; } // 定义一个委托,名字随便起 public delegate void CatShoutDel

C# 委托,Lambda表达式,事件

本文章参考sikiC#高级篇,转载请注明出处. 什么是委托 如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托与使用 声明委托有四种方式.一种是原生的,另外三种是C#为了方便给我们封装好的. 四种声明方式分别为delegate, Action, Func, 在C#中使用一个类分为两个阶段,首先定义这个类,告诉编译器这个类由什么字段和方法组成,然后使用这个类实例化对象.在我们使用委托的时候,也需要经过这两个阶段,首先定义委托,告诉编

.NET基础 (15)委托

委托1 请解释委托的基本原理2 委托回调静态方法和实例方法有何区别3 什么是链式委托4 链式委托的执行顺序是怎么样的5 可否定义拥有返回值的方法的委托链6 委托通常可以应用在哪些场合 委托1 请解释委托的基本原理 委托是一个钟数据类型,用来传递方法.委托类型继承自System.Delegate,自定义委托类型都直接继承自System.NulticastDelegate,System.NulticastDelegate又继承自System.Delegate.每个委托至少包含一个指向某个方法的指针,

委托+内置委托方法

委托概念:如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托: 在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字段和方法组成的,然后使用这个类实例化对象.在我们使用委托的时候,也需要经过这两个阶段,首先定义委托,告诉编译器我们这个委托可以指向哪些类型的方法,然后,创建该委托的实例. 定义委托的语法如下: delegate void IntMethodInvoker(int x); 定义了一个委托叫做IntMe

从事件来看委托

事件是基于委托,为委托提供了一种发布/订阅机制,在dotNet到处都能看到事件,一个简单的例子就是在windows应用程序中,Button类提供了Click事件,这类事件就是委托,触发Click事件时调用的处理程序方法需要定义,其参数也是由委托类型定义的,事件模型可以用下图简要说明. 在这个模型中,事件的响应者通过订阅关系直接关联在事件拥有者的事件上,我们把这种事件模型或者CLR事件模型.因为CLR事件本质上是一个委托实例,我们暂且模仿CLR属性的说法,把CLR事件定义为一个委托类型实例的包装器

Net中委托之二多播委托

本篇主要讲解多播委托 1.多播委托的实例 public class MyDelegate { private delegate int NoParameterWithReturn();//1.声明委托 public static void Show() { NoParameterWithReturn method = new NoParameterWithReturn(ShowSomething);//2.委托的实例化 //多播委托 method += ShowSomething;//按顺序添加

亲们,委托你们是否已忘记

委托和事件是.Net 框架的重要组成部分,在GUI程序开发中,大量使用了事件处理,但是亲们,对于委托,我们是否还记得曾经在书上看到的详细内容.委托的使用注意事项是什么?我们会使用委托和事件,但是我们不了解事件背后的原理,亲们,我们忘记委托了吗?反正我是忘记了. 委托是方法调用的指针,也称为函数指针,是一种特殊的对象类型,包含的是方法的地址.注意是地址,在.Net 中,委托不同于c++中的函数指针,在C#中 委托是类型安全的操作,这意味着什么呢?这意味着我们定义的方法签名必须和委托的定义类型以及返

.NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式

开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Func/Predicate)和超爱的Lambda表达式.为了方便码农们,.Net基类库针对实际开发中最常用的情形提供了几个预定义好的委托,这些委托可以直接使用,无需再重头定义一个自己的委托类型.预定义委托在.Net基类库中使用的比较广泛,比如在Lambda表达式和并行计算中都大量地使用,需要我们予以关注起来! /* 新语法索引 */ 1.自动属性 Auto-Impleme