欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#-委托

程序员文章站 2022-12-16 15:55:54
一、委托是什么? 委托一般可以看作是持有一个或多个方法的对象。可以把委托看做是对象,其和我们使用一个对象的过程一样。 声明->创建委托对象->给委托赋值->调用委托。 关于委托还有另一种理解,我们可以把委托类比为C/C++中的函数指针这一概念。只是委托是类型安全的。函数指针就是 指向函数入口地址的一 ......

一、委托是什么?

 

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

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

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

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

方法可以执行不同的方法。

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

  使用委托的实例:

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 。

  其余也类似,关于返回值。

三、匿名方法

   上面的代码既有关于匿名方法的介绍也有lambda表达式的一般使用方式。

   mydel del = delegate (int x){ console.writeline(""); };

        mydel del  =   x  => x + 1 ;