南有乔木z

随心所欲,想写啥就写啥。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、委托是什么?

   1. 委托的定义

  委托一般可以看作是持有一个或多个方法的对象。可以把委托看做是对象,其和我们使用一个对象的过程一样。

 

  2. 为什么会有委托

  对于C语言这种面向过程的语言,为了构建大型程序和模块化编程,实现代码更好的解耦,会非常充分和良好地运用函数指针。

    函数指针的定义、初始化赋值、触发条件与委托的使用非常的类似。

 

  关于委托还有另一种理解,我们可以把委托类比为C/C++中的函数指针这一概念。只是委托是类型安全的。

       函数指针就是指向函数入口地址的一个地址变量。我们可以随便更改指针指向的地址,以达到对不同函数的调用。

  函数指针特别适合用于回调函数,可以在函数执行时再判断函数指针指向的函数。委托也可以在执行的时候再决定指向哪一个方法。

       同样我们可以更改委托的赋值方法可以执行不同的方法。

 

  从这个角度去看,委托的是为了完成一种松耦合的程序设计,为不同对象间调用方法时提供一种良好且安全的机制。

   

  3. 委托的具体使用  

  声明->创建委托对象->给委托赋值->调用委托。  

  使用委托的实例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 

namespace DelegateDemo
{
    delegate void MyDel(int value);
    class Program
    {
        void PrintLow(int value)
        {
            Console.WriteLine("The low value is {0}", value);
        }

        void PrintHigh(int value)
        {
            Console.WriteLine("The high value is {0}", value);
        }

        static void Main(string[] args)
        {
            Program program = new Program();
            //MyDel del;
            Action <int> del = null;
            Random random = new Random();
            int randomValue = random.Next(99);
            if (randomValue < 50)
            {
                //del = delegate (int x)
                //      {
                //          Console.WriteLine("Low value{0}", x);
                //      };
                del =(int x)=>
                {
                    Console.WriteLine("Low value:{0}", x);
                };

                //del = x => { };  //匿名方法+Lambda表达式
            }
            else
            {
                del = delegate (int x)
                {
                    Console.WriteLine("High value{0}", x);
                };
            }
            del(randomValue);
            Console.ReadKey();
        }
    }
}

二、泛型委托

  CLR环境中给我们内置了几个常用委托Action、 Action<T>、Func<T>、Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个委托了,

  就用系统内置的这几个已经能够满足大部分的需求,且让代码符合规范。 

 

  例如上面代码的两种定义:public delegate void MyDel(int x) ; //自己定义的一种委托类型,返回值为void,一个int类型参数,

  其实系统已经帮我们定义了。我们完全可以采用  Action <T>  泛型来定义: Action <int> del = null 。

  其余也类似,关于返回值,委托函数最好不用返回值

 

三、事件与委托

  事件本质上还是一种委托,只是对于事件,谁来触发事件做了要求,实现对于类型更好地封装。

  参考文档:https://www.cnblogs.com/skysoot/archive/2012/04/05/2433639.html

 

posted on 2018-12-05 21:35  南有乔木z  阅读(424)  评论(0编辑  收藏  举报