C#编程之委托与事件(一)
多线程程序设计是一个庞大的主题,而本文试图在.net Framework环境下,使用C#语言来描述委托、事件、多线程程序及反射的概貌。希望本文能有助于大家理解委托、事件、多线程及反射的概念,理解委托、事件、多线程及反射的用途,理解它的C#实现方法,理解线程将为我们带来的好处和麻烦。C#是一种新的语言,因此它的线程机制也有许多独特的地方,希望大家能通过本文清楚地看到这些,从而可以对委托、事件、多线程等技术进行更深入的理解和探索。 本文的重点内容:委托、事件、多线程、反射 一. 委托 委托的本质 --在C#中,委托是一个特殊的类; --在某种程度上,相当于C++的函数指针; --在某种程度上,相当于接口(Interface); 委托的定义 --关键字:delegate --public delegate void MyDelegate(string message); 注:在这里我们先了解一个概念,什么是函数签名?(在这里我不做过多解释,大家知道这个概念就行)。 使用委托 我们先来看看一个小的委托示例: 平时,如果说我们要设计一个做简单加减运算的方法,通常是怎么做的呢?看看下面代码: 1class Program2 {3 /// <summary> 4 /// 加法运算 5 /// </summary> 6 /// <param name="x">x</param> 7 /// <param name="y">y</param> 8 /// <returns></returns> 9 private static int Add(int x, int y)10 {11 int result = x + y;12 Console.WriteLine("x + y = {0}",result);13 return result;14 }1516 /// <summary>17 /// 减法运算18 /// </summary>19 /// <param name="x">x</param>20 /// <param name="y">y</param>21 /// <returns></returns>22 private static int Sub(int x, int y)23 {24 int result = x - y;25 Console.WriteLine("x - y = {0}", result);26 return result;27 }2829 static void Main(string[] args)30 {31 Add(8, 8);32 Sub(8, 1);33 Console.Read();34 }35 } 上面的代码只要是学过程序的人都能看懂,也写得出,不过我们怎么通过委托来处理+,-运算呢?请看下面定义: 1namespace DelegateSample12{3 //定义一委托 4 public delegate int OperationDelegate(int x,int y);5 public class Operator6 {7 private int _x, _y;8 public Operator(int x, int y)9 {10 this._x = x;11 this._y = y;12 }1314 public void Operate(OperationDelegate del)15 {16 del(_x, _y);17 }18 }19} 上面定义一个返回int类型需要两个int参数的委托。Operator里提供了一个操作方法带有一个委托参数。那通过委托怎么来处理这个简单的运算呢?好,现在我们来修改我们之前定义的主方法,如下: 1namespace DelegateSample12{3 class Program4 {5 /// <summary> 6 /// 加法运算 7 /// </summary> 8 /// <param name="x">x</param> 9 /// <param name="y">y</param>10 /// <returns></returns>11 private static int Add(int x, int y)12 {13 int result = x + y;14 Console.WriteLine("x + y = {0}",result);15 return result;16 }1718 /// <summary>19 /// 减法运算20 /// </summary>21 /// <param name="x">x</param>22 /// <param name="y">y</param>23 /// <returns></returns>24 private static int Sub(int x, int y)25 {26 int result = x - y;27 Console.WriteLine("x - y = {0}", result);28 return result;29 }3031 static void Main(string[] args)32 {33 //声明一个委托对象34 OperationDelegate del = null;35 del += new OperationDelegate(Add);36 del += new OperationDelegate(Sub);3738 Operator op = new Operator(5, 3);39 op.Operate(del);40 Console.ReadLine();41 }42 }43}44 从上面的例子看,委托OperationDelegate代表了一组方法,他们的方法签名是: --返回值:int; 参数:int ,int ; 只要符合该签名的方法,都可以赋给此委托:从上面不难看出,我要要创建一委托,则如下定义:1OperationDelegate del += new OperationDelegate(方法名); 从上面可以看到(+=)这个运算符,那是不是也有(-=)这个运算符呢?这就涉及到另外一个概念了--委托链。 --委托链:实际上委托实例就是一个委托链,+=代表增加委托实例到委托链中,相反-=则代表去掉该委托实例。1OperationDelegate del = null;2del += new OperationDelegate(Add); //增加委托实例到委托链3del -= new OperationDelegate(Add); //去掉委托实例到 委托的意义之一 --委托可以使得程序的复用程度提高; --委托在一定程度上想当于接口; 例如:前面例子中的方法Operate(),由于接受的是一个委托类型;那么,我们可以对委托类型赋予不同的方法,来改变Operate()的性质。 我们在来看看另外一个示例: --我们想输出一串数字,从0-100; --对于输出的要求有三种; -1、输出到控制台 -2、输出到窗体中的ListBox中; -3、输出到文本文件中; 解决方案: --使用委托和接口, 代码如下: 1namespace DelegateSample22{3 //定义一委托 4 public delegate void ShowNumberDel(object[] items);5 public class ProcessNumber6 {7 private object[] items;8 public ProcessNumber(int max)9 {10 items = new object[max];11 for (int i = 0; i < max; ++i)12 {13 items[i] = i;14 }15 }1617 public void ProcessItems(ShowNumberDel show)18 {19 show(items);20 }21 }22}23在这里我们先把界面上的控件布局好并做好调用委托的准备工作,效果及代码如下: 代码如下: 1private ProcessNumber pn = null; 2ShowNumberDel del = null;3 4private void Form1_Load(object sender, EventArgs e)5{6 pn = new ProcessNumber(100);7}89//到控制台10private void ShowInConsole(object[] items)11{12 foreach (object item in items)13 {14 Console.WriteLine(item);15 }16}1718//到ListBox19private void ShowInListBox(object[] items)20{21 listBox1.Items.Clear();22 foreach (object item in items)23 {24 listBox1.Items.Add(item);25 }26}2728//到文本文件29private void ShowInFile(object[] items)30{31 using (StreamWriter sw = new StreamWriter("Test.txt", true))32 {33 foreach (object item in items)34 {35 sw.WriteLine(item);36 }37 }38}使用委托: 1private void button1_Click(object sender, EventArgs e)2{3 pn.ProcessItems(new ShowNumberDel(ShowInConsole));4}5 6private void button2_Click(object sender, EventArgs e)7{8 pn.ProcessItems(new ShowNumberDel(ShowInListBox));9}1011private void button3_Click(object sender, EventArgs e)12{13 pn.ProcessItems(new ShowNumberDel(ShowInFile));14}1516private void button4_Click(object sender, EventArgs e)17{18 del += new ShowNumberDel(this.ShowInListBox);19 del += new ShowNumberDel(this.ShowInFile);2021 pn.ProcessItems(del);22}完整的测试代码如下: 1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Text; 7using System.Windows.Forms; 8using System.IO;910namespace DelegateSample211{12 public partial class Form1 : Form13 {14 public Form1()15 {16 InitializeComponent();17 }1819 private ProcessNumber pn = null;20 ShowNumberDel del = null;2122 private void Form1_Load(object sender, EventArgs e)23 {24 pn = new ProcessNumber(100);25 }2627 private void ShowInConsole(object[] items)28 {29 foreach (object item in items)30 {31 Console.WriteLine(item);32 } 33 }34 private void ShowInListBox(object[] items)35 {36 listBox1.Items.Clear();37 foreach (object item in items)38 {39 listBox1.Items.Add(item);40 }41 }42 private void ShowInFile(object[] items)43 {44 using (StreamWriter sw = new StreamWriter("Test.txt", true))45 {46 foreach (object item in items)47 {48 sw.WriteLine(item);49 }50 }51 }5253 private void button1_Click(object sender, EventArgs e)54 {55 pn.ProcessItems(new ShowNumberDel(ShowInConsole)); 56 }5758 private void button2_Click(object sender, EventArgs e)59 {60 pn.ProcessItems(new ShowNumberDel(ShowInListBox));61 }6263 private void button3_Click(object sender, EventArgs e)64 {65 pn.ProcessItems(new ShowNumberDel(ShowInFile));66 }6768 private void button4_Click(object sender, EventArgs e)69 {70 del += new ShowNumberDel(this.ShowInListBox);71 del += new ShowNumberDel(this.ShowInFile);72 pn.ProcessItems(del);73 } 74 }75} 委托的意义之二 --在C#中使用线程需要用到委托 - Thread thread = new Thread(new ThreadStart(target));− -这里的ThreadStart就是一个委托,他的定义是: -target既为符号ThreadStart委托的方法名; --函数回调 - 当我们定义了一个委托;public delegate void MyDelegate(int source); -对于异步调用来说,就有BeginInvoke()和EndInvoke()方法; -del.BeginInvoke(source, new System.AsyncCallback(CallBack), "test"); -private void CallBack(IAsyncResult asyncResult) {int result = del.EndInvoke(asyncResult);//...... } 这里需要理解的就是什么叫函数回调?这个话题留给大家讨论,在此不作详细解说。关于委托本文只是入门级的文章,要想更详细深入的学习委托请查看具体的书籍或资料,本文就简单介绍到这里。
转载于:https://www.cnblogs.com/Holmes-Jin/archive/2012/01/12/2320243.html
C#编程之委托与事件(一)相关推荐
- 第九节:委托和事件(1)(委托的发展历史、插件式编程、多播委托)
一. 委托的发展历史和基本用法 说起委托,每个人可能都会对他有不同的理解,结合实战中委托的使用,我对其理解是:委托和类一样,是用户的一个自定义类型,委托可以有参数.有返回值,委托的关键字是delega ...
- C#编程利器之四:委托与事件(Delegate and event) (上)
本文试图在.net Framework环境下,使用C#语言来描述委托.事件的概貌.希望本文能有助于大家理解委托.事件的概念,理解委托.事件的用途,理解它的C#实现方法,理解委托与事件为我们带来的好处. ...
- 七天学习计划_c#_[2][3][4][5]委托、事件、委托与事件的区别、泛型委托、Func\Action\predicate
由于委托之前的博客已经详细写了,这里就简单的过一遍,复习一下: 了解委托 基于委托开发事件驱动程序变得非常简单. 使用委托可以大大简化多线程编程难度. 理解委托 委托也可以看做成一种数据类型,可以定义 ...
- 在C#中使用代理的方式触发事件 (委托和事件 ) (转)
From: http://www.cnblogs.com/gzhnan/articles/1859477.html 在C#中使用代理的方式触发事件 (委托和事件 ) 事件(event)是一个非常重要 ...
- 大白话系列之C#委托与事件讲解大结局
今天是大白话系列之C#委托与事件讲解的大结局,也是我们最关心的,在日常的MES系统编程中到底怎样使用这样的利器,其实我们每天都在使用事件,一个窗体,一个按钮都包含这事件,只是很少用到自己写的委托和事件 ...
- C#委托、事件、消息(入门级)
本文的内容需要一定的OOP知识,不过我会在另一个内容介绍,由于实现细节,我会先写这部分. 大家关于委托.事件和消息大多是从WinForm编程接触的,首先是你在可视化的设计器里双击控件写所谓事件的处理代 ...
- C# 委托(Delegate) 事件(Event)应用详解
委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每 ...
- 如鹏网 net高级技术 第二章 委托和事件(复习)
委托 委托是一种数据类型,可以声明委托类型变量. 委托是一种可以指向方法的数据类型. 声明委托的方式:delegate返回值类型 委托类型名(参数) 比如 delegate void MyDel( ...
- C#委托和事件的应用Observer模式实例
委托.事件.Observer模式 委托:方法变量,简单点说就是把方法当做变量 事件:我们可以把他看做是对委托的一种封装,这种定义并不准确,便很好理解 Observer模式:定义对象间的一对多的依赖关系 ...
最新文章
- idea自动捕获_Smilefie:如何通过检测微笑来自动捕获自拍
- 帝国cms底部代码哪里改?要修改版权和统计代码
- 如何通过.reg文件来修改注册表键和子键以及键值
- 用JS查看修改CSS样式(cssText,attribute('style'),currentStyle,getComputedStyle)
- hihoCoder - 1082 - 然而沼跃鱼早就看穿了一切 (字符串处理!!)
- 程序是在RAM里还是flash里执行
- React开发(174):ant design按钮确认删除
- 如何对一个变量数据进行正则判定_生存分析数据中的BuckleyJamesMultipleRegression Model...
- 桁架机器人运动视频_CUBIC桁架式机器人被广泛应用的原因
- 网络安全之uRPF技术
- wpa_supplicant详解
- 【转】很实用的编程英语词库,共收录一千五百余条词汇
- 深度神经网络如何训练,深度神经网络怎么用
- 大家总在讲情商,那到底什么是情商?
- 进击的Objective-C -------------------NSSting,NSSMutableString和NSArray,NSMutableArray
- replay attacker
- Google Play开发者账号注册
- WORDPRESS 网站打不开 error establishing a database connection 、is marked as crashed and should be repa
- 屏保问题(即背光灯的关闭)
- 基于Java高校校园设备报修系统
热门文章
- 关于AAARR模型,还停留在理论却不会用?附实例讲解
- 产品经理为什么越来越不值钱?不懂数据,只能尴尬退场
- 数据分析必备的统计学(二):假设检验
- centos系统 查看当前python执行的进程
- 由于找不到appvisvsubsystems32.dll_老实人就别找女朋友了 跟个老实人结婚有多累_新闻资讯...
- HDU2019 数列有序!
- Day2:360培训学习重点笔记(7.14)
- remote: 认证失败,请确认您输入了正确的账号密码。 fatal: Authentication failed
- 将pdbqt文件转成SMILES文件
- R语言中,保留含有特定字符的元素