http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 12435|回复: 2

[Bran学习笔记] C#委托的理解

[复制链接]
发表于 2016-1-1 22:50:33 | 显示全部楼层 |阅读模式
一、委托是啥?

       委托是一个类,定义方法的类型,将方法作为另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以有效的避免在程序中使用大量的if-else/switch语句,同时也使程序具有更好的可扩展性。
       简单点说就是将方法作为另一个方法的参数

二、如何使用委托?
      
       1.定义委托                   
         [访问修饰符] delegate 返回类型 委托名称(形参)
         public delegate void MyDelegate(string name);
         因为Delegate是一个类,所以在任何可以声明类的地方都可以声明委托,可以定义在类的外面,也可以定义在类的里面。   
         注意:委托和方法名必须具有相同的参数和返回值
       2.声明委托
          [访问修饰符] 委托名 委托实例化名;
          MyDelegate  myDelegate  
       3.创建委托对象
          委托实例化名 = new 委托名(某类方法)
          注意:当实例化委托时,要提供一个引用方法,将其作为构造方法的参数,被引用的这个方法必须对委托有相同的参数(即签名)。
          第一种写法
          MyDelegate myDelegate=new MyDelegate(example.Method);
          MyDelegate myDelegate1=new MyDelegate(new Example().Method);
          第二种写法
          MyDelegate myDelegate2 = example.Method;
          MyDelegate myDelegate3 = new Example().Method;
          暂时学这二种,还有几种写法,慢慢学。

       4.委托使用         
          委托实例化名(实参)
          myDelegate("Hello World");
[C#] 纯文本查看 复制代码
    class Program
    {
        delegate void MyDelegate(string message);
        public class Example
        {
            public void Method(string message){
                Console.WriteLine(message);
            }
        }
        static void Main(string[] args)
        {
            Example example = new Example();
            MyDelegate myDelegate = new MyDelegate(example.Method);
            MyDelegate myDelegate1 = new MyDelegate(new  Example().Method);
            MyDelegate myDelegate2 = example.Method;
            MyDelegate myDelegate3 = new Example().Method;
            myDelegate("Hello World");
            Console.ReadKey();
        }
    }

       5.带返回值委托
          当创建委托对象时,委托的返回值必须和委托的方法相对应。
[C#] 纯文本查看 复制代码
    class Program
    {
        delegate string MyDelegate(string message);
        public class Example
        {
            public string Method(string message)
            {
                return "Hello" + message;
            }
        }
        static void Main(string[] args)
        {
            Example example = new Example();
            MyDelegate myDelegate = new MyDelegate(example.Method);
            MyDelegate myDelegate1 = new MyDelegate(new  Example().Method);
            MyDelegate myDelegate2 = example.Method;
            MyDelegate myDelegate3 = new Example().Method;
            myDelegate("World");
            Console.ReadKey();
        }
    }








1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2016-1-2 21:01:45 | 显示全部楼层
    三、多播委托?

        先看这段代码
[C#] 纯文本查看 复制代码
static void Main(string[] args) {
    string name1, name2;
    name1 = "sufeinet";
    name2 = "bran"; 
    Console.ReadKey();
}

       既然委托是一个类,它和string地位一样,都是定义参数的类型,那么是不是也可以这样声明呢?
[C#] 纯文本查看 复制代码
        static void Main(string[] args)
        {
            MyDelegate myDelegate1, myDelegate2;
            myDelegate1 = new Example().Method;
            myDelegate2 = new Example().Method;
        }

       QQ截图20160102200940.png
       这里可以看出来,这样是可以的。但是它不同与string,委托可以将多个方法赋给同一个委托,也叫将多个方法绑定到同一个委托,当调用这个委托的时候,将依次调用绑定的方法。
QQ截图20160102203616.png
     这里要注意的是:第一次 “=”是赋值的语法,第二次“+=”是绑定的语法,如果第一次就使用“=”就会出错“使用了未赋值的局部变量”
QQ截图20160102204256.png

       简化写法
QQ截图20160102204442.png
       既然委托可以绑定方法,那么也可以取消方法的绑定。用“-=”
QQ截图20160102204907.png
            这里要记住的是:
      
      多播委托,在你调用的时候,一次调用只能传给这些委托的方法相同的参数,
      至于返回值,假如你的委托返回的是同一个类型,那么在调用多播委托的时候,返回值将被依次覆盖,最终的返回值是最后一次调用的返回值。
     所以说多播委托一般没有返回值,即就是void,因为给多播委托设返回值一般是没有什么意义的!



发表于 2016-2-15 21:37:20 | 显示全部楼层
不错,讲的挺好的。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-4-25 07:41

© 2014-2021

快速回复 返回顶部 返回列表