委托(一):委托与方法

   一,利用委托将方法作为方法的参数

                首先来看个小例子:

             

namespace 委托示例2
{
    /*****
     * 委托示例一
     * 说明:此段程序主要是将委托作为方法的参数传入方法中,使得具体调用时再根据需要为方法赋值。
     *
     * 关键点:利用委托将方法作为方法的参数
     *
     *
     *
     * ******/

    //委托的定义
    //1,委托:委托出现的位置和string相同,所以GreetingDelegate应该也是个类型,但是委托的声明方式和类完全不同。
    //2,委托在编译的时候确实会被编译成类,因为delegate是一个类,所以在任何可以生命类的地方都可以声明委托。
    public delegate void  GreetingDelegate(string name);

    class Program
    {
          static void Main(string[] args)
        {
              GreetPeople ("水田如雅",EnglishGreeting);
              GreetPeople ("vac",ChineseGreeting);

              Console.ReadKey();

        }

         #region 没有定义委托方法时“问好”方式的调用

        ///// <summary>
        ///// 用于向某人问好的方法,当传递代表某人姓名的name参数,比如jimmy进去的时候,在这个方法中,将会调用EnglishGreeting方法,再次传递name参数,Ehglish则用于向屏幕输出good,morning,jimmy
        ///// </summary>
        ///// <param name="name"></param>
        //public void GreetPeople(string name, Language lang)
        //{
        //    //做些额外的事情,比如初始化之类的,此处省略
        //    switch (lang)
        //    {
        //        case Language.English:
        //            EnglishGreeting(name);
        //            break;
        //        case Language.Chinese:
        //            ChineseGreeting(name);
        //            break;

        //    }
        //    //EnglishGreeting(name);

        //}
        #endregion

        #region 用委托来实现问好方式的调用

        //使用了委托之后,对GreetPeople方法进行的改进
             public static void  GreetPeople(string name, GreetingDelegate MakeGreeting)
             {
                 MakeGreeting(name);

             }

        #endregion

        /// <summary>
        /// 英语的说早上好的方法
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static void  EnglishGreeting(string name)
        {
            Console .WriteLine ("good,morning!"+name);

        }

        /// <summary>
        /// 汉语的问好方法
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static  void   ChineseGreeting(string name)
        {
            Console .WriteLine( "早上好,宝贝儿~~~" + name);

        }

    #region 有了委托之后就不在需要枚举了
    ///// <summary>
    ///// 定义一个枚举,用来判断到底用哪个版本的Greeting问候方法合适
    ///// </summary>
    //public enum Language
    //{
    //    English, Chinese
    //}
    #endregion

    }

}

        首先没有委托的时候,我们要定义一个枚举,将English,Chinese这两个变化点写进去,然后在具体的GreetPeople方法中进行调用的时候,我们要通过swich进行一个选择,但是,这样做只能应对暂时的平衡,当遇到变化的时候,比如增加个日式欢迎方法,我们又要回去改动switch方法。

     

         在面向对象的设计思想中,我们以前用过很多设计模式来去除选择和应对变化,比如工厂,状态模式,命令模式,但是如果我们使用了委托,我们就可以将方法当做变量来处理,这样事情就变得非常简单,而且从整体结构上看,比加入设计模式容易得多。

   二,将方法绑定到委托

        首先来看示例:

        

namespace 将方法绑定到委托示例
{
    //委托的定义
    //1,委托:委托出现的位置和string相同,所以GreetingDelegate应该也是个类型,但是委托的声明方式和类完全不同。
    //2,委托在编译的时候确实会被编译成类,因为delegate是一个类,所以在任何可以生命类的地方都可以声明委托。
    public delegate void GreetingDelegate(string name);

    class Program
    {
        static void Main(string[] args)
        {
            //既然委托GreetingDelegate和string类型一样,都是定义了一种参数类型,那么是不是也可以像下面这样使用委托。。。。。。
            //so,尝试如下调用
            //注意:1,“=”是赋值的语法;“+=”是绑定的语法;
            //.......2,如果第一次就是用“+=”就会出现使用了未赋值的局部变量的编译错误

            #region 将委托作为变量

            ////如下,我们将委托作为变量传入
            //GreetingDelegate delegate1, delegate2;
            //delegate1 = EnglishGreeting;
            //delegate2 = ChineseGreeting;

            //GreetPeople("水田如雅", delegate1);
            //GreetPeople("vac", delegate2);

            //Console.ReadKey();
            #endregion

            #region 委托搭载方法示例
                //GreetingDelegate delegate1;
                //delegate1 = EnglishGreeting;//先向委托类型的变量赋值
                //delegate1 += ChineseGreeting;//向此委托变量再绑定一个方法

                ////将先后调用EnglishGreeting与ChineseGreeting方法
                //GreetPeople("水田如雅", delegate1);  //输出的name都是“水田如雅”
                //Console.ReadKey();
            #endregion

            #region 通过委托直接调用方法
                //GreetingDelegate delegate1;

                //delegate1 = EnglishGreeting; //委托变量的赋值
                //delegate1 += ChineseGreeting;//在委托上再次绑定一个方法

                ////将先后调用两个方法
                //delegate1("水田如雅(vac)");
                //Console.ReadKey();
            #endregion

            #region 简化委托的调用
                //GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);//委托的定义和赋值
                //delegate1 += ChineseGreeting;//绑定方法
            #endregion

            #region 取消委托的绑定示例

                //GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
                //delegate1 += ChineseGreeting;//给委托绑定方法

                ////先后调用EnglishGreeting和ChineseGreeting
                //GreetPeople("这是第一次调用", delegate1);
                //Console.WriteLine();

                ////取消EnglishGreeting调用
                //delegate1 -= EnglishGreeting;//取消对EnglishGreeting

                ////再次调用
                //GreetPeople("第二次调用方法,注意看有几个方法被调用了。。。。。。", delegate1);
                //Console.ReadKey();

            #endregion

        }

        #region 用委托来实现问好方式的调用

       //使用了委托之后,对GreetPeople方法进行的改进
        public static void GreetPeople(string name, GreetingDelegate MakeGreeting)
        {
            MakeGreeting(name);

        }

        #endregion

        /// <summary>
        /// 英语的说早上好的方法
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static void EnglishGreeting(string name)
        {
            Console.WriteLine("good,morning!" + name);

        }

        /// <summary>
        /// 汉语的问好方法
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static void ChineseGreeting(string name)
        {
            Console.WriteLine("早上好,宝贝儿~~~" + name);

        }

    }
}

        下面总结下委托的调用过程:

             

             1,委托的调用都是先赋值,然后再搭载其他方法。

             2,委托可以搭载方法,也可以将方法unload掉。

           

      使用了委托后,我们可以在使用时简化调用并且做到灵活选择所调用的方法,委托可以替代以前接口或实现类在结构上利用多态实现方法调用时的灵活性,并在一定程度上简化调用方法。

                                                           

                                                                            未完待续。。。。。。。。。。

时间: 2014-12-07
Tags: string, static, void

委托(一):委托与方法的相关文章

c#-各位前辈,C#里什么是委托,委托有什么用?如何才能学好委托?

问题描述 各位前辈,C#里什么是委托,委托有什么用?如何才能学好委托? 各位前辈,C#里什么是委托,委托有什么用?如何才能学好委托? 解决方案 也许你没有学过委托,但是你已经用到它了.如果你开发过asp.net webform的程序,或者wpf程序,里面定义一个事件处理程序,这个程序和事件的挂钩本身就是委托的典型的应用. 解决方案二: 举例: this.Load += new EventHander(this.Page_Load); 解决方案三: 简单点说,就是一个类里面有动作了,通过委托来通知

C#委托基础7——匿名方法

C#委托基础系列原于2011年2月份发表在我的新浪博客中,现在将其般至本博客.   class Program { double AddInt(int x, int y) { return x + y; } string AddString(string s1, string s2) { return s1 + s2; } static void Main(string[] args) { Program p = new Program(); // 以为前两个参数为int,他们运行的结果为dou

C#多线程-不同线程之间通过事件委托封送调用方法

多线程 前两天做了一个自定义单件Timer,该Timer能够根据相应数据记录(Row)中的记录ID和设定分钟Minutes 做相应的事件调用,但是如果此事件处理程序在一Form中时则不能正确调用它,但是把82到93行的注释去掉就可以了.     Timer大体定义如下:   1 using System;  2 using System.Threading;  3 using System.ComponentModel;  4 using System.Windows.Forms;  5   6

winform问题,在backgroundwork里使用委托在委托里又用到了委托,结果我的进度条无法显示

问题描述 privatevoidbackgroundWorker1_DoWork(objectsender,DoWorkEventArgse){try{//外层的委托this.Invoke(newMethodInvoker(delegate{//判断选中的tab页if(this.tabControl1.SelectedTab.Name=="tabPage1"){//内层的委托newMethodInvoker(delegate{BindGridUp(ds1,ds2);}));}if(th

如果只有一个方法还有必要用委托么?

问题描述 如果只有一个方法还有必要用委托么? 在委托这个地方卡了很久,在网上也看了很多文章,基本上都是说的委托的语法,偶尔有介绍使用场景,但是还是一直没弄明白,总有点迷迷糊糊的,做技术就应该吧问题搞的明明白白,要不然还不如不搞,希望大家给讲解下这个问题.谢谢了比如下面的代码 static Func<int int int> CalculateHandler = (x y) => x + y; static void Main(string[] args) { var result = C

C# 委托 事件 匿名方法

(*) 委托 delegate 从最简单的例子开始: namespace ConsoleApplication1 { class Program { // 委托其实就相当于一个类型.这里,类型的名字叫BinaryOp public delegate int BinaryOp(int x, int y); static public int Add(int x, int y) { return x + y; } static void Main() { // 创建一个BinaryOp类型的实例,用

多个委托方法的顺序执行

using System; namespace 委托和事件 {     internal class Program     {         private static void Main(string[] args)         {             Action action = One;             action += Two;             action += Three;             Delegate[] delegates = act

C#中委托(Delegates)的使用方法详解_C#教程

1. 委托是什么? 其实,我一直思考如何讲解委托,才能把委托说得更透彻.说实话,每个人都委托都有不同的见解,因为看问题的角度不同.个人认为,可以从以下2点来理解:  (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型.  (2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象. 既然委托是一种类型,那么它存储的是什么数据? 我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址.调用委托的时候,委托包含的所有方法将被执行. 2. 委托类型的定义 委托是类型

如何将多线程中接收数据处理的方法通过委托事件共用户使用呀!

问题描述 如何将多线程中接收数据处理的方法通过委托事件共用户使用呀!具体描述:一个TcpServer类主要是任务有启动服务.停止服务.接收连接的Socket(每接收一个Socket的建立一个线程对该Socket进行管理.线程调用的是Socket中的一个方法)Socket类:接收数据.发送数据等.注:将接收到的数据通过事件的方式委托到外面进行操作.如何做呀!还是这样的设计细路就有问题呀!!该如何设计呢!!! 解决方案 解决方案二:参考:http://blog.csdn.net/zhiang75/a

c#-C# 反射 方法 带参数是(委托型)求 高人解答

问题描述 C# 反射 方法 带参数是(委托型)求 高人解答 C# 反射 方法 带参数是(委托型) 方法 (委托 ) { 委托1= 委托 } 解决方案 object[] obj= new object [] { Messagecallback};//Messagecallback() 是写的一个方法 与委托 定义参数一样 return t.InvokeMember(name, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlag