zoukankan      html  css  js  c++  java
  • C#中的委托 Delegate(委托 也叫代表,代表一类方法)

    1. 委托类似与 C或C++中的函数指针,但委托是 面向对象的,并且是类型安全的

        详情可查看官方文档:https://msdn.microsoft.com/en-us/library/ms173172.aspx

    2. 委托 就相对与 一类方法 (即方法类,或者方法接口)

             而这一类方法都具有相同的 修饰符、形参以及 返回值类型

        2.1. 委托 既是方法:

                   声明委托的方式如下:在修饰符后加上 delegate ['dɛlɪɡət]关键字

    public delegate void Del(string message);
    

               从格式上看,它与方法的声明极为相似,就是多了个 delegate关键字而已

                  表示声明了一类,修饰符为public、一个string类型形参的、没有返回值的方法

         2.2. 但 委托 不是普通的方法,因为 它也是类,

                所以委托只能声明,而不能定义,如不能这样写:

    private delegate void Doing(string name){
          System.Windows.MessageBox.Show();
    }
    

      2.3. 实例化委托,调用委托

     //声明一个void, 形参是string的委托
    public delegate void Del(string name);
    
    //定义个个cut方法
    public void cut(string name)
    {
           System.Windows.MessageBox.Show("fuck " + name);
    }
    //实例化委托,传的参数是一个方法的名字,这里是cut
    Del a = new Del(cut);
    a("CCC");//调用委托,相当于调用cut("CCC");
    

    3. 委托 有什么用,搞这么复杂有什么意思

        3.1. 将方法名作为方法参数传递,提高代码的多变性和灵活性,如下:

    public delegate void SayHello();
    
    public void SayInEnglish(){
          toSay = "Hello";
    }
    
    public void SayInChinese(){
          toSay = "你好";
    }
    
    public void HelloToSomebody(SayHello say){//将方法作为参数来传递
          say(toSay);
          System.Windows.MessageBox.Show(toSay);
    }
    

          以及:

           public delegate void Save(string word);
    
            public void SaveTime(string str)
            {
                  string abc = "abc";
                  System.Windows.MessageBox.Show("我做我的事情 "+str);//WPF
            }
    
            public void SaveNothing(string str)
            {
                  System.Windows.MessageBox.Show("没事可做啊 "+str);
            }
    
            public void HelloToSomebody(Save save)
            {
                  save("试一试");
            }
    
            public static void main(string[] args){
    
                   Save s = new Save(SaveTime);
                   Save s2 = new Save(SaveNothing);
                   HelloToSomebody(s);
                   HelloToSomebody(s2);
            }
    
    
    /////////////////////////////////
            结果是:    我做我的事情 试一试
                            没事可做啊 试一试
    

    4. 委托 的多播 (Multicasting of a Delegate) "+="、"-="

          

    using System;
    
    delegate int NumberChanger(int n);
    namespace DelegateAppl
    {
       class TestDelegate
       {
          static int num = 10;
          public static int AddNum(int p)
          {
             num += p;
             return num;
          }
    
          public static int MultNum(int q)
          {
             num *= q;
             return num;
          }
          public static int getNum()
          {
             return num;
          }
    
          static void Main(string[] args)
          {
             // 创建委托实例
             NumberChanger nc;
             NumberChanger nc1 = new NumberChanger(AddNum);
             NumberChanger nc2 = new NumberChanger(MultNum);
             nc = nc1;
             nc += nc2;//到这里,nc其实绑定了2个委托,调用时会按绑定的顺序执行
             // 调用多播
             nc(5);
             Console.WriteLine("Value of Num: {0}", getNum());
             Console.ReadKey();
          }
       }
    }
    
    
    ////////////////////////////////////
       结果是:  Value of Num: 75
    

      注意:委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。

                                       "-" 运算符可用于从合并的委托中移除组件委托。

    总结:

          1. 委托 即使 方法,又是 类(一种特殊的方法:可以方便统一调用;特殊的类,能当方法来用的类,这也够特殊了吧),委托是一类方法

          2. 委托 先声明,后实例化,然后才能调用,委托的参数 是一个方法名

          3. 委托的 多调 "+=" , 相反操作 "-="

          4. 委托 主要用于事件 还有回调函数中····

          

      也可查看:http://www.tracefact.net/csharp-programming/delegates-and-events-in-csharp.aspx    

      

    参考:http://www.runoob.com/csharp/csharp-delegate.html

        

  • 相关阅读:
    HDU2586 How far away?(tarjan的LCA)
    You Raise Me Up
    POJ2891 Strange Way to Express Integers(中国剩余定理)
    POJ2142 The Balance(扩展欧几里得)
    HDU 1166模仿大牛写的线段树
    NetWord Dinic
    HDU 1754 线段树裸题
    hdu1394 Minimum Inversion Number
    hdu2795 Billboard
    【完全版】线段树
  • 原文地址:https://www.cnblogs.com/tommy-huang/p/4828589.html
Copyright © 2011-2022 走看看