委托是一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似。与 C 中的函数指针不同,委托是面向对象的、类型安全的和保险的。一个委托类型是代表与特定参数列表和返回类型的方法的引用类型。实例化委托时,可以将其实例与具有兼容签名和返回类型的任何方法相关联。您可以通过委托实例调用(或调用)该方法。委托用于将方法作为参数传递给其他方法。事件处理程序只不过是通过委托调用的方法。您可以创建自定义方法,并且诸如Windows控件之类的类可以在发生特定事件时调用您的方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Ch1
{
//静态方法
public delegate void GreetingDelegate(string name);//委托 public class FirstDelegate
{
public static void GreetingChinese(string name)
{
Console.WriteLine("早上好:" + name);
} public static void GreetingEnglish(string name)
{
Console.WriteLine("Good morning:" + name);
}
} public class GreetingManager
{
public static GreetingDelegate MakeLanguageByDelegate;
public static void GreetingPeople(string name)
{
if (MakeLanguageByDelegate != null)
{
MakeLanguageByDelegate(name);
}
} public static event GreetingDelegate MakeLanguageByEvent;//事件,不管是不是声明为public,它总是被声明为private public static void GreetingPeopleEvent(string name)
{
if (MakeLanguageByEvent != null)
{
MakeLanguageByEvent(name);
}
} }
//普通方法 public class FirstDelegate1
{
public void GreetingChinese(string name)
{
Console.WriteLine("早上好:" + name);
} public void GreetingEnglish(string name)
{
Console.WriteLine("Good morning:" + name);
}
} public class GreetingManager1
{
public GreetingDelegate MakeLanguageByDelegate;
public void GreetingPeople(string name)
{
if (MakeLanguageByDelegate != null)
{
MakeLanguageByDelegate(name);
}
} public event GreetingDelegate MakeLanguageByEvent; public void GreetingPeopleEvent(string name)
{
if (MakeLanguageByEvent != null)
{
MakeLanguageByEvent(name);
}
} } }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Ch1
{
/**
* Observer模式定义对象间的一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
* 水烧开的时候通知报警器和显示器
* */
public class WaterDelegate
{
private int temperature = ;
public delegate void BoilHandler(int param);//声明委托
public event BoilHandler BoilEvent;//声明事件 public void BoilWater()
{
for (int i = ; i <= ; i++)
{
temperature = i;
if (temperature >= ) //温度大于95警告并且显示温度
{
if (BoilEvent != null) //如果有对象注册
{
BoilEvent(temperature); //调用所有注册方法
Console.WriteLine("-----------------");
}
}
}
}
} //报警
public class Alarm
{
public void MakeAlert(int temperature)
{
Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", temperature);
} /**
* .Net Framework中的委托与事件
* 委托声明原型中的Object类型的参数代表了Object,也就是监视对象,在本例中是 Heater(热水器)。回调函数(比如Alarm的MakeAlert)可以通过它访问触发事件的对象(Heater)。
* EventArgs 对象包含了Observer所感兴趣的数据,在本例中是temperature。
* */
public void MakeAlert(Object sender, BoiledEventArgs e)
{
Heater heater = (Heater)sender;
Console.WriteLine("Alarm:{0} - {1}, 嘀嘀嘀,水已经 {2} 度了 ", heater.area, heater.type, e.temperature);
}
} //显示
public class Display
{
public static void ShowMessage(int temperature)
{
Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", temperature);
} public static void ShowMessage(Object sender, BoiledEventArgs e)
{
Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", e.temperature);
Console.WriteLine();
}
} public class Heater
{
private int temperature; public string area { get; set; } //添加地区
public string type { get; set; } //添加类型 public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);//委托
public event BoiledEventHandler Boiled;//事件 // 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视
protected virtual void OnBoild(BoiledEventArgs e)
{
if (Boiled != null) //如果有对象注册
{
Boiled(this, e); //调用所有注册方法
}
} public void BoilWater()
{
for (int i = ; i <= ; i++)
{
temperature = i;
if (temperature >= ) //温度大于95警告并且显示温度
{
BoiledEventArgs e = new BoiledEventArgs(temperature);
OnBoild(e);
}
}
}
} // 定义BoiledEventArgs类,传递给Observer所感兴趣的信息
public class BoiledEventArgs : EventArgs
{
public readonly int temperature; public BoiledEventArgs(int temperature)
{
this.temperature = temperature;
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks; namespace Ch1
{
class Program
{
static void Main(string[] args)
{
//------------------------静态处理方法------------------------
//GreetingManager.MakeLanguageByDelegate = FirstDelegate.GreetingEnglish;
//GreetingManager.GreetingPeople("jason hua"); //GreetingManager.MakeLanguageByDelegate = FirstDelegate.GreetingChinese;
//GreetingManager.GreetingPeople("杰"); //GreetingManager.MakeLanguageByEvent += FirstDelegate.GreetingEnglish;
//GreetingManager.GreetingPeopleEvent("Jason Hua"); //GreetingManager.MakeLanguageByEvent += FirstDelegate.GreetingChinese;
//GreetingManager.GreetingPeopleEvent("杰"); //-----------------------普通处理方法-------------------------------
//FirstDelegate1 fd = new FirstDelegate1();
//GreetingManager1 gm = new GreetingManager1();
//gm.MakeLanguageByDelegate = fd.GreetingEnglish;//注册对象
//gm.GreetingPeople("jason hua"); //gm.MakeLanguageByDelegate = fd.GreetingChinese;//注册对象
//gm.GreetingPeople("杰");
//Console.WriteLine();
//gm.MakeLanguageByEvent += fd.GreetingEnglish;//注册对象
//gm.GreetingPeopleEvent("jason hua"); //gm.MakeLanguageByEvent += fd.GreetingChinese;//注册对象
//gm.GreetingPeopleEvent("杰"); //普通的项目中的例子
//WaterDelegate wd = new WaterDelegate();
//Alarm alarm = new Alarm(); //wd.BoilEvent += alarm.MakeAlert;//注册对象
//wd.BoilEvent += Display.ShowMessage;//注册静态对象 //wd.BoilWater(); //仿微软的事件与委托,项目中的小例子
Heater heater = new Heater();
Alarm alarm = new Alarm(); heater.area = "河南";
heater.type = "九阳";
heater.Boiled += alarm.MakeAlert;
heater.Boiled += Display.ShowMessage; heater.BoilWater(); Console.ReadLine();
}
}
}

引言委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。

参看网址:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx

其他的基础功能

1.  C#高级功能(四)扩展方法和索引

2. C#高级功能(三)Action、Func,Tuple

3. C#高级功能(二)LINQ 和Enumerable类

4. C#高级功能(一)Lambda 表达式

5. C#中泛型的解释(object,list,var,dynamic的区别)

6. C#中委托

7. C#和.NET版本对比

C#中Delegate的更多相关文章

  1. 转iOS中delegate、protocol的关系

    iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolc ...

  2. jQuery中delegate与on的用法与区别

    在jQuery1.7中 .delegate()已被.on()取代.对于早期版本,它仍然使用事件委托的最有效手段. 在事件绑定和委派,delegate()和on在一般情况下,这两种方法是等效的. .de ...

  3. 对iOS中Delegate的理解

    首先 协议protocol 和委托delegate 是两个完全不同的概念  放在一起说 是因为我们总是在同一个头文件里看到它们: 首先解释一下什么是委托 :举个例子 ,我工作的时候给你打电话,让你帮我 ...

  4. C#中Delegate和Event以及它们的区别(转载)

    一.Delegate委托可以理解为一个方法签名. 可以将方法作为另外一个方法的参数带入其中进行运算.在C#中我们有三种方式去创建委托,分别如下: public delegate void Print( ...

  5. swift 中delegate的使用

    今天写了delegate,遇到以下问题: 这里protocol的写法有问题,如果delegate指向一个实现了某个协议对象的引用,在oc里是这样写delegate的类型 id<protocol& ...

  6. .net中delegate的使用

    js中的写法: var GetEntityList = function(pParameter){ var list =[]; return list; }; var aEntityList = Ge ...

  7. C#知识点总结系列:3、C#中Delegate和Event

    一.Delegate委托可以理解为一个方法签名. 可以将方法作为另外一个方法的参数带入其中进行运算.在C#中我们有三种方式去创建委托,分别如下: public delegate void Print( ...

  8. 聊一聊JQ中delegate事件委托的好处

    下面举个例子 我们希望通过点击使得点击的li标签变红 <body style="height:2000px;"> <ul> <li>1111&l ...

  9. C#知识点总结系列:3、C#中Delegate和Event以及它们的区别

    1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 ...

随机推荐

  1. IOS 从系统图库中获取 图片 并设置为头像

    总会遇到一些应用 要拍照 设置图片之类的的  总结一个方法备用  以后 会 继续拓展到 多图 @interface AddCustomerViewController : UIViewControll ...

  2. oracle 11g ora-01843 无效月份

    PS:进入注册表--regedit--HKEY_LOCAL_MACHINE--SOFTWARE--ORACLE-KEY_OraDb11g_home1---NLS_LANG(双击此项设置的键值为AMER ...

  3. 结合源码看nginx-1.4.0之nginx模块组织结构详解

    目录 0. 摘要 1. nginx模块组织结构 2. nginx模块数据结构 3. nginx模块初始化 4. 一个简单的http模块 5. 小结 6. 参考资料 0. 摘要 nginx有五大优点:模 ...

  4. 关于onsaveinstancestate和 onRestoreInstanceState()

    之所以有这个话题,是因为工作遇到过两个问题.一个问题是页面空白,fragment重复创建.另一个问题是登录页用到了AutoCompleteTextView,调用showDropDown()方法导致cr ...

  5. Unity3d之按键

    if (Input.GetKeyDown(KeyCode.A)){ Debug.Log("您按下了A键"); } if (Input.GetKeyUp(KeyCode.A)) { ...

  6. iOS10.1不能调试解决方案

    对于一些有强迫证的程序员来说只要苹果更新系统,会马上更新,但是军哥更新过10.1的系统后发现Xcode8不能调试了 苹果这次太不人性话了,解决办法,最简单的是 拷贝iOS10.1支持文件放在Xcode ...

  7. Nodejs之WebSocket

    文章导读: 一.概述-what's WebSocket? 二.运行在浏览器中的WebSocket客户端+使用ws模块搭建的简单服务器 三.Node中的WebSocket 四.socket.io 五.扩 ...

  8. Centos下LAMP环境搭建

    CentOs下环境搭建.2015.04.15.0001 Author:周凯 Time: 2015.04.15 版本号:2015.04.15.0001 安装过程 安装apache yum install ...

  9. 基于ASP.Net +easyUI框架上传图片,判断格式+实现即时浏览

    <div> 选择图片:<input id="idFile" style="width:224px" runat="server&qu ...

  10. AngularJS尝鲜一

    第一个小例子,体验一下: <!DOCTYPE html> <html> <head> <title>Index</title> </h ...