委托是一种安全地封装方法的类型,它与 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. Reduction: the word AT

    Reduction: the word AT Share Tweet Share Tagged With: AT Reduction Study the AT reduction.  There ar ...

  2. 何谓domReady

    我的博客已经写过好几篇如何实现domReady的文章,最近做培训,面向新手们,需要彻彻底底向他们说明这个东西,于是就有了这篇文章. 我们经常看人们用 document.getElementById(& ...

  3. [PHP]Nginx与PHP的文件上传大小限制

    ---------------------------------------------------------------------------------------------------- ...

  4. Android Uri获取真实路径以及文件名的方法【转】

    原文地址:https://blog.csdn.net/MikoGodZd/article/details/50979653 在Android 编程中经常会用到uri转化为文件路径 下面是4.4后通过U ...

  5. 一个神奇的BUG :Failed to finalize session : INSTALL_FAILED_INVALID_APK: /data/app/vmdl99393454.tmp/10_slice__ signatures are inconsistent

    Android Studio 在Gradle编译完成后安装APK时总是失败,EventLog提示如下信息: Failed to finalize session : INSTALL_FAILED_IN ...

  6. Hibernate学习笔记2.5(Hibernate核心开发接口和三种状态)

    1.configuration(配置信息管理,产生sessionfactory) sessionfactory管理一系列的连接池 opensession 永远打开新的,需要手动close getcur ...

  7. Java学习03 (第一遍)

    Java是面向对象的语言,函数是面向过程语言的叫法,比如C语言,在Java中一般称之为方法. 构造方法的作用是实例化对象,每个类中都有,即使不写程序也会分配一个默认无参数的构造方法. Java中都是对 ...

  8. ios instancetype 和 id 的异同

    1.0 相同点:都可以作为方法的返回类型 2.0 不同点: a.instancetype 可以返回和方法所在类相同类型的对象   id 只能返回未知类型的对象 b. instancetype 只能作为 ...

  9. 吴裕雄 python神经网络 花朵图片识别(10)

    import osimport numpy as npimport matplotlib.pyplot as pltfrom PIL import Image, ImageChopsfrom skim ...

  10. mysql 分配内存大小配置

    优化 innodb_buffer_pool_size  = 10*1024*1024*1024