多线程程序设计是一个庞大的主题,而本文试图在.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. 第九节:委托和事件(1)(委托的发展历史、插件式编程、多播委托)

    一. 委托的发展历史和基本用法 说起委托,每个人可能都会对他有不同的理解,结合实战中委托的使用,我对其理解是:委托和类一样,是用户的一个自定义类型,委托可以有参数.有返回值,委托的关键字是delega ...

  2. C#编程利器之四:委托与事件(Delegate and event) (上)

    本文试图在.net Framework环境下,使用C#语言来描述委托.事件的概貌.希望本文能有助于大家理解委托.事件的概念,理解委托.事件的用途,理解它的C#实现方法,理解委托与事件为我们带来的好处. ...

  3. 七天学习计划_c#_[2][3][4][5]委托、事件、委托与事件的区别、泛型委托、Func\Action\predicate

    由于委托之前的博客已经详细写了,这里就简单的过一遍,复习一下: 了解委托 基于委托开发事件驱动程序变得非常简单. 使用委托可以大大简化多线程编程难度. 理解委托 委托也可以看做成一种数据类型,可以定义 ...

  4. 在C#中使用代理的方式触发事件 (委托和事件 ) (转)

    From:  http://www.cnblogs.com/gzhnan/articles/1859477.html 在C#中使用代理的方式触发事件 (委托和事件 ) 事件(event)是一个非常重要 ...

  5. 大白话系列之C#委托与事件讲解大结局

    今天是大白话系列之C#委托与事件讲解的大结局,也是我们最关心的,在日常的MES系统编程中到底怎样使用这样的利器,其实我们每天都在使用事件,一个窗体,一个按钮都包含这事件,只是很少用到自己写的委托和事件 ...

  6. C#委托、事件、消息(入门级)

    本文的内容需要一定的OOP知识,不过我会在另一个内容介绍,由于实现细节,我会先写这部分. 大家关于委托.事件和消息大多是从WinForm编程接触的,首先是你在可视化的设计器里双击控件写所谓事件的处理代 ...

  7. C# 委托(Delegate) 事件(Event)应用详解

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

  8. 如鹏网 net高级技术 第二章 委托和事件(复习)

    委托 委托是一种数据类型,可以声明委托类型变量. 委托是一种可以指向方法的数据类型. 声明委托的方式:delegate返回值类型 委托类型名(参数)   比如 delegate void MyDel( ...

  9. C#委托和事件的应用Observer模式实例

    委托.事件.Observer模式 委托:方法变量,简单点说就是把方法当做变量 事件:我们可以把他看做是对委托的一种封装,这种定义并不准确,便很好理解 Observer模式:定义对象间的一对多的依赖关系 ...

最新文章

  1. idea自动捕获_Smilefie:如何通过检测微笑来自动捕获自拍
  2. 帝国cms底部代码哪里改?要修改版权和统计代码
  3. 如何通过.reg文件来修改注册表键和子键以及键值
  4. 用JS查看修改CSS样式(cssText,attribute('style'),currentStyle,getComputedStyle)
  5. hihoCoder - 1082 - 然而沼跃鱼早就看穿了一切 (字符串处理!!)
  6. 程序是在RAM里还是flash里执行
  7. React开发(174):ant design按钮确认删除
  8. 如何对一个变量数据进行正则判定_生存分析数据中的BuckleyJamesMultipleRegression Model...
  9. 桁架机器人运动视频_CUBIC桁架式机器人被广泛应用的原因
  10. 网络安全之uRPF技术
  11. wpa_supplicant详解
  12. 【转】很实用的编程英语词库,共收录一千五百余条词汇
  13. 深度神经网络如何训练,深度神经网络怎么用
  14. 大家总在讲情商,那到底什么是情商?
  15. 进击的Objective-C -------------------NSSting,NSSMutableString和NSArray,NSMutableArray
  16. replay attacker
  17. Google Play开发者账号注册
  18. WORDPRESS 网站打不开 error establishing a database connection 、is marked as crashed and should be repa
  19. 屏保问题(即背光灯的关闭)
  20. 基于Java高校校园设备报修系统

热门文章

  1. 关于AAARR模型,还停留在理论却不会用?附实例讲解
  2. 产品经理为什么越来越不值钱?不懂数据,只能尴尬退场
  3. 数据分析必备的统计学(二):假设检验
  4. centos系统 查看当前python执行的进程
  5. 由于找不到appvisvsubsystems32.dll_老实人就别找女朋友了 跟个老实人结婚有多累_新闻资讯...
  6. HDU2019 数列有序!
  7. Day2:360培训学习重点笔记(7.14)
  8. remote: 认证失败,请确认您输入了正确的账号密码。 fatal: Authentication failed
  9. 将pdbqt文件转成SMILES文件
  10. R语言中,保留含有特定字符的元素