zoukankan      html  css  js  c++  java
  • 委托学习(1)

    1. 委托

     1. 我们都知道指针在C/C++中的使用是非常灵活具有以下几个优点:

      a.为函数提供修改调用变元的灵活手段;
      b.支持C 动态分配子程序
      c.可以改善某些子程序的效率

      >>在数据传递时,如果数据块较大(比如说数据缓冲区或比较大的结构),这时就可以使用指针传递地址而不是实际数据,即提高传输速度,又节省大量内存。
      d.为动态数据结构(如二叉树、链表)提供支持

       虽然C#不支持指针但是委托很好的解决了这个难题。鞋面是委托与指针的区别:

      a,函数指针事不安全的类型,而委托是完全面向对象和类型安全的。

          b,函数指针大都指向成员函数,而委托同时封装了对象实例和方法。

      委托实例一个有趣的现象是:它不知道也不关心她所封装的方法所属的类,它所关心的仅限于这些方法必须与委托类型兼容。因此,委托非常适用于"匿名"调用。

     1.1 声明委托

      

      使用关键字 delegate 来声明委托,形式如下:

      【特性】【修饰符】delegate【返回值类型】 【委托名】(【形参列表】)

      【特性】,【修饰符】:可选

        【返回值类型】,关键字delegate,【委托名】:必须的

      【形参列表】:可选

        C#的委托名是一中标识符,命名规则:一般采用首字母大写。

        ● 它们具有相同的签名,参数个数,类型,顺序,修饰符完全相同。

      ● 返回值类型也是相同的。

        委托定义了一种引用类型,封装了对方法的引用,委托定义了签名和返回值型。

      例如:我们定义一返回值为Int32 参数列表为Object和Int32类型的。

      delegate Int32 MyDelegate(Object val,Int32 i);     

      下面的方法是与MyDelegate兼容的 

      Int32 MyMethod(Object val , Int32  i); 

      对于委托而言:即使它们具有形同的参数列表和返回值类型,仍被认为是两个不同的委托。委托原则:名称等效而不是结构等效。

    1.2 委托实例

      【委托名】 【委托实例名】= new 【委托名】(【参数列表】) ;

      其中【参数】必须是方法名或委托名(说白了还是方法),可以是静态的方法但是必须与委托类型兼容。如果参数是委托名,则它标识为其吹安徽建副本的委托实例。

    1.3 使用委托

     

     Delegate.cs

      

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Delegate
    {
        //声明委托
        public delegate int PrintMessageHandler(string message);
    
        //定义测试类
        public class Test
        {
            public static int Print(string mesg)
            {
                Console.WriteLine(mesg);
                return mesg.Length;
            }
    
            //使用委托实例做参数(函数作为参数)
            public static void PrintTitle(PrintMessageHandler prn)
            {
                prn("===========================");
                prn("     委托实例作为参数      ");
                prn("===========================");
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Test test = new Test();
    
                //实例一委托传参的对象(我感觉其实类似于C++的函数指针)
                PrintMessageHandler prn = new PrintMessageHandler(Test.Print);
                string msg = "委托实例参数";
                //msg = Console.ReadLine().ToString();
                int len = prn(msg);
                //int len1 = Test.Print(msg);
                Console.WriteLine("参数长度:" + len);
                //Console.WriteLine("参数长度:" + len1);
    
                Test.PrintTitle(prn);
                Console.ReadLine();
            }
        }
    }
    

     运行结果:

  • 相关阅读:
    URAL 2046 A
    URAL 2056 Scholarship 水题
    Codeforces Gym 100286I iSharp 水题
    Codeforces Gym H. Hell on the Markets 贪心
    Codeforces Gym 100286G Giant Screen 水题
    Codeforces Gym 100286B Blind Walk DFS
    Codeforces Gym 100286F Problem F. Fibonacci System 数位DP
    Codeforces Gym 100286A. Aerodynamics 计算几何 求二维凸包面积
    Codeforces Gym 100418K Cards 暴力打表
    Codeforces Gym 100418J Lucky tickets 数位DP
  • 原文地址:https://www.cnblogs.com/wuzhang/p/wuzhang20140807.html
Copyright © 2011-2022 走看看