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();
            }
        }
    }
    

     运行结果:

  • 相关阅读:
    房地产英语 Real estate词汇
    自制Flash FLV视频播放器
    .net反编译工具Reflector下载
    JQUery插件thickbox
    50 Great Photoshop Tutorials for Clever Beginners
    AspNet中你或许不知道的技巧(转)
    常用的设计网站(收藏)
    35 Green and Earthy Photoshop Effects
    使用 ASP.NET 2.0 增强网站的安全性
    asp.net中实现登陆的时候用SSL
  • 原文地址:https://www.cnblogs.com/wuzhang/p/wuzhang20140807.html
Copyright © 2011-2022 走看看