委托是一种安全地封装方法的类型,它与 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#中委托的更多相关文章

  1. C#中委托和事件的区别实例解析

    这篇文章主要介绍了C#中委托和事件的区别,并分别以实例形式展示了通过委托执行方法与通过事件执行方法,以及相关的执行流程与原理分析,需要的朋友可以参考下 本文实例分析了C#中委托和事件的区别,分享给大家 ...

  2. C#中委托和事件

    目 录 将方法作为方法的参数 将方法绑定到委托 更好的封装性 限制类型能力 范例说明 Observer 设计模式简介 实现范例的Observer 设计模式 .NET 框架中的委托与事件 为什么委托定义 ...

  3. 详解Objective-C中委托和协议

    Objective-C委托和协议本没有任何关系,协议如前所述,就是起到C++中纯虚类的作用,对于“委托”则和协议没有关系,只是我们经常利用协议还实现委托的机制,其实不用协议也完全可以实现委托. AD: ...

  4. c#中委托和事件(转)

    C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 ...

  5. C#中委托的理解

    请注意,这只是个人关于C#中委托的一点点理解,参考了一些博客,如有不周之处,请指出,谢谢! 委托是一种函数指针,委托是方法的抽象,方法是委托的实例.委托是C#语言的一道坎,明白了委托才能算是C#真正入 ...

  6. C#中委托的发展与匿名函数

    匿名函数(C# 编程指南) 匿名函数是一个“内联”语句或表达式,可在需要委托类型的任何地方使用. 可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数. 共有两种匿名函数 ...

  7. C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路

    C#不用union,而是有更好的方式实现   用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...

  8. C#中委托、匿名函数、Lambda表达式的一些个人理解

    0x01定义一个委托,相当于定义一个可以存储方法的特殊变量类型 下面我们看具体的代码,通过代码更好理解 delegate void IntMethodInvoker(int x); 这行代码就是声明一 ...

  9. C#中委托实现的异步编程

    所谓同步:如果在代码中调用了一个方法,则必须等待该方法所有的代码执行完毕之后,才能回到原来的地方执行下一行代码. 异步:如果不等待调用的方法执行完,就执行下一行代码. 1.0 同步例子: class ...

随机推荐

  1. 2.ECS内 经典网络与VPC网络的区别

    对应阿里云学习视频地址:https://help.aliyun.com/video_detail/67686.html?spm=5176.208355.1107604.1.10d82ca1J91Ckt ...

  2. LeetCode OJ 49. Group Anagrams

    题目 Given an array of strings, group anagrams together. For example, given: ["eat", "t ...

  3. 编译Linux内核(Mac OS平台)

    操作系统第一次实验需要编译Linux内核,我之前在Mac上一直使用的都是Parallels Desktop这个软件,所以这次也将课程网站上提供的Ubuntu安装在了PD上,但是编译完内核后无法进入Ub ...

  4. 关于C# WinForm中进度条的实现方法

    http://www.cnblogs.com/Sue_/articles/2024932.html 进度条是一个软件人性化考虑之一,他给用户的感觉就是程序内部在不停的动作,执行到了什么程度,而不是整个 ...

  5. 5分钟K线图压力线买点怎么看?

    某开盘后底开一直呈现形成了一个长时间的箱体振荡的走势,K线在底位振荡时,其波动底点总是在不断抬高的话,这种走势说明有资金在场中积极运作,正是由于资金悄然建仓导致了底点慢慢抬高的走势,在底点不断抬高时, ...

  6. spring使用中ModelAttribute的内容被覆盖

    在前台以get方式向后台提交数据: 后台接收: 后台接收参数的时候,由于user里面也有一个属性为id,后台在接收参数的时候,User里面的id会被重新赋值,这是一个大坑.如果后续继续用User来做操 ...

  7. C++学习一explicit

    explicit关键字 C++中的关键字explicit主要是用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换.类构造函数默认情况下声明为隐式的即i ...

  8. JS----贪吃蛇游戏

    在网上找到的几种例子 <!DOCTYPE html> <html > <head> <meta http-equiv="Content-Type&q ...

  9. pring Boot 与Spring Cloud版本对应

    Spring Boot Spring Cloud 1.2.x Angel版本 1.3.x Brixton版本 1.4.x Camden版本 1.5.x Dalston版本.Edgware版本 2.0. ...

  10. webservice客户端 get delete post 请求

    package com.cn.eport.util.common; import java.io.IOException; import java.util.List; import org.apac ...