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

        

  • 相关阅读:
    攻克python3-进程
    攻克python3-线程
    攻克python3-socket
    攻克python3-面向对象
    攻克python3-装饰器
    攻克python3-函数
    攻克python3-文件操作
    算法基础
    MongoDB存储基础教程
    Python操作Excle
  • 原文地址:https://www.cnblogs.com/tommy-huang/p/4828589.html
Copyright © 2011-2022 走看看