C#中委托
委托是一种安全地封装方法的类型,它与 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
其他的基础功能
5. C#中泛型的解释(object,list,var,dynamic的区别)
6. C#中委托
7. C#和.NET版本对比
C#中委托的更多相关文章
- C#中委托和事件的区别实例解析
这篇文章主要介绍了C#中委托和事件的区别,并分别以实例形式展示了通过委托执行方法与通过事件执行方法,以及相关的执行流程与原理分析,需要的朋友可以参考下 本文实例分析了C#中委托和事件的区别,分享给大家 ...
- C#中委托和事件
目 录 将方法作为方法的参数 将方法绑定到委托 更好的封装性 限制类型能力 范例说明 Observer 设计模式简介 实现范例的Observer 设计模式 .NET 框架中的委托与事件 为什么委托定义 ...
- 详解Objective-C中委托和协议
Objective-C委托和协议本没有任何关系,协议如前所述,就是起到C++中纯虚类的作用,对于“委托”则和协议没有关系,只是我们经常利用协议还实现委托的机制,其实不用协议也完全可以实现委托. AD: ...
- c#中委托和事件(转)
C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 ...
- C#中委托的理解
请注意,这只是个人关于C#中委托的一点点理解,参考了一些博客,如有不周之处,请指出,谢谢! 委托是一种函数指针,委托是方法的抽象,方法是委托的实例.委托是C#语言的一道坎,明白了委托才能算是C#真正入 ...
- C#中委托的发展与匿名函数
匿名函数(C# 编程指南) 匿名函数是一个“内联”语句或表达式,可在需要委托类型的任何地方使用. 可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数. 共有两种匿名函数 ...
- C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路
C#不用union,而是有更好的方式实现 用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...
- C#中委托、匿名函数、Lambda表达式的一些个人理解
0x01定义一个委托,相当于定义一个可以存储方法的特殊变量类型 下面我们看具体的代码,通过代码更好理解 delegate void IntMethodInvoker(int x); 这行代码就是声明一 ...
- C#中委托实现的异步编程
所谓同步:如果在代码中调用了一个方法,则必须等待该方法所有的代码执行完毕之后,才能回到原来的地方执行下一行代码. 异步:如果不等待调用的方法执行完,就执行下一行代码. 1.0 同步例子: class ...
随机推荐
- 从初始化列表和构造函数谈C++的初始化机制
来源:http://blog.csdn.net/theprinceofelf/article/details/20057359 前段时间被人问及“初始化列表和构造有什么区别?”我竟一时语塞,只好回头 ...
- python的解构
今天学习python看到python的解构,觉得很有用就写下来,防止自己忘了 首先定义个列表 然后我们来解构 字典呢?字典需要两个*号才能解构 这样调用不明显 来个明显点的 上面错误是,你定义了一个形 ...
- css实现角标
效果图: 简单方式可以使用背景图片,但这里我使用的css来实现,最笨的方式是使用矩形div然后旋转遮挡就可以, <div class='checked-item'> 角标实现 < ...
- FBackup:个人用途与商业用途都是免费的
當自己在備份電腦資料時,若沒有使用備份及還原軟體時,我想很多人的作法就是「想到應該要備份了,然後進行備份檔案的壓縮.壓縮好之後複製到不同的磁碟機或燒錄光碟」,等要用的時候,再拿出來還原.若是這樣,其實 ...
- puppet自动化运维
Puppet实现自动化运维 一.案例分析 1.案例概述: 随着服务器数量的增多,系统管理员任务量也逐渐增加,这时就需要简洁的.强大的框架来完成系统管理任务为实现这一目的,我们将引入一批工具,这批工具是 ...
- 历届试题 小数第n位-(同余公式+快速幂)
问题描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式. 本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始 ...
- location search的中文加密
最近项目中遇到一个这样问题,在页面跳转时,追加了location.search,有中文字符,但是在分享第二次时,这个链接无法获取中文字段,变成乱码. 仔细对比,发现在页面分享时,浏览器自动对中文进行了 ...
- React设置宽度的坑
[React设置宽度的坑] 我们知道通过ref可以获取DOM元素,通过style属性可以给此DOM元素添加样式. 但下面两行的赋值是无效的: this.HomeRootDiv.style.width= ...
- selenium自动化测试之整合测试报告
selenium自动化测试之整合测试报告 标签(空格分隔): 整合报告 如下截图我们添加一个文件叫做:latest_report.py文件, import time import os import ...
- day17 正则表达式 re模块和hashlib模块
今日内容 1. re&正则表达式(*****) 注:不要将自定义文件命名为re import re re.findall(正则表达式,被匹配的字符串) 拿着正则表达式去字符串中找,返回一个列表 ...