行远-自迩

导航

委托-张子扬博客

    前面一篇已经讲述了为什么使用委托,以及使用委托有什么好处,今天再此学习张子扬博客逐步了解委托。

     1. 方法作为方法的参数

      这个看起来很别扭,和C++中出现函数指针有点类似,只是函数参数是一个指针而已。

public void GreetPeople(string name, *** MakeGreeting)

     ***只是这个指针类型而已;  

首先:

 1  public void chineseGreet(string name)
 2  {
 3      Console.WriteLine("{0}  你好 ", name);
 4  }
 5  public void englishGreet(string name)
 6  {
 7      Console.WriteLine("{0}  Hello", name);
 8  }
 9  public enum Language
10  {
11     English, Chinese
12  }
13 
14  public void GreetPeople(string name, Language lang)
15  {
16     //做某些额外的事情,比如初始化之类,此处略
17     swith(lang)
18     {
19         case Language.English:
20            EnglishGreeting(name);
21            break;
22        case Language.Chinese:
23            ChineseGreeting(name);
24            break;
25     }
26  } 

上述就是两个语种的打招呼语句,但如果是多种语言,就必须写足够多方法,有点费事,

为解决上述麻烦,委托就可以使用:

public delegate void greet(string name);

看到上述声明,其相比于之前定义方法,只是多了 delegate,其余得如参数,返回值类型都完全一致;

现在可以重新定义:

 public void GreetPeople(string name,GreetingDelegate MakeGreeting)

将委托作为了方法参数;

下面是完整代码:

namespace Delegate {
    
    //定义委托,它定义了可以代表的方法的类型
    public delegate void GreetingDelegate(string name);
    
    class Program {

       private static void EnglishGreeting(string name) {
           Console.WriteLine("Morning, " + name);
       }

       private static void ChineseGreeting(string name) {
           Console.WriteLine("早上好, " + name);
       }

       //注意此方法,它接受一个GreetingDelegate类型的方法作为参数
       private static void GreetPeople(string name, GreetingDelegate MakeGreeting) {
           MakeGreeting(name);
        }

       static void Main(string[] args) {
           GreetPeople("Jimmy Zhang", EnglishGreeting);   //这两行代码的使用,是如何调用委托,相比于switch语句简洁性
           GreetPeople("张子阳", ChineseGreeting); 
           Console.ReadKey();
       }
    }
}

2. 方法绑定委托

如前文所述,委托既然可以作为类,那就可以定义一个变量像普通变量一样完成赋值初始化,

GreetingDelegate delegate1, delegate2;
delegate1 = EnglishGreeting;
delegate2 = ChineseGreeting;

但委托变量又不像普通变量一样,它可以绑定多个方法;

 GreetingDelegate delegate1;
 delegate1 = EnglishGreeting; // 先给委托类型的变量赋值
 delegate1 += ChineseGreeting;   // 给此委托变量再绑定一个方法

也可以new一个出来;

GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);

下面是自己针对前文所学写的,学会使用委托,以及定义,赋值,绑定,以 new委托变量完成初始化:

    public class greetClass
    {
        public void chineseGreet(string name)
        {
            Console.WriteLine("{0}  你好 ", name);
        }
        public void englishGreet(string name)
        {
            Console.WriteLine("{0}  Hello", name);
        }
    }

    public delegate void greet(string name);

    /// <summary>
    /// 纯粹是为了将委托作为函数参数使用
    /// </summary>
    public class greetDelegate
    { 
        public void makeGreet(string name,greet greeting)
        {
            greeting(name);
        }
    }

        static void Main(string[] args)
        {
            greetClass k_greetClass = new greetClass();
            greetDelegate g_greetDelegate = new greetDelegate();
            //委托可以作为函数的参数,像C++中函数指针一样传递函数的地址即可,只是这里是引用而已
            g_greetDelegate.makeGreet("洋洋", k_greetClass.chineseGreet);
            g_greetDelegate.makeGreet("Young", k_greetClass.englishGreet);

            //既然委托可以当作一个类,那们他就会对象,可以对对象进行初始化等

            greet greetDelegate1, greetDelegate2;//两个委托型变量,下面两中方法,一个委托变量还可以绑定多个方法
            greetDelegate1 = new greet(k_greetClass.chineseGreet);
            greetDelegate1 += k_greetClass.englishGreet;
            greetDelegate2 = k_greetClass.englishGreet;

            g_greetDelegate.makeGreet("洋洋", greetDelegate1);
            g_greetDelegate.makeGreet("Young", greetDelegate2);

            Console.ReadKey();
        }

posted on 2020-01-15 13:55  行远-自迩  阅读(302)  评论(0编辑  收藏  举报