c#委托(个人理解)

什么是委托?

个人理解来说,委托就是使用函数方法的一个渠道,只不过这个渠道有些特殊,可以通过这个渠道使用一个方法,同样的是也可以通过这个渠道使用多个函数方法。

如何使用委托?

首先问自己一个问题,在编程语言的学习中,我们是怎样使用自己定义的或者已存在的类的?无非这几步:1.类的声明2.类的实例化3.通过实例化的对象使用类里面的变量或者是函数方法
那么你需要知道的就是,委托的使用方法和类几乎完全一样,不同的就是,类实例化之后叫做对象或者是实例,而委托实例化之后,还叫委托

上代码:

using System;


namespace DelegationText
{
    class Program
    {

        //1. 委托的声明
        delegate bool Judge(bool x);

这样就声明了一个委托,不管是哪一个函数方法,只要他的返回值类型为布尔类型,并且还具有一个布尔类型的变量,都可以通过这个委托来调用。有人会问,为什么别的类型的函数方法不能通过这个委托调用呢?

还是一样的问自己个问题,你声明了一个类,在类的构造函数的声明中需要外部传进去一个布尔类型的变量,如果你传进去一个整型的变量,编译器会通过吗?同样的道理,你在声明委托的时候,指定了需要一个类型是布尔类型,并且带有一个布尔类型变量的函数方法当作参数,如果你传进去不同的参数,编译器也是不会通过的。

委托声明的位置

类可以在那里声明?类外、类内是的,委托也是一样

委托的使用

using System;


namespace DelegationText
{
    class Program
    {

        //1. 委托的声明
        delegate void Judge(bool x);
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Judge judge = new Judge(One_two);
            bool Y_N = true;
            judge(Y_N);
        }
   }
}

什么是多路广播委托?

在上面的例子中,可以很明显的看出来,委托的使用次数和函数方法的调用次数是相同的,一对一,那么多路广播委托就是一对多的关系,也就是,也就是一个委托对应的是多个函数

怎样做到上面说的一对多呢?

解决方法:向委托中添加方法
需要注意的是:如果使用多路官博委托的时候,委托的类型一定要是void否则,委托的反胡子hi不知道最终要送回到哪里,做测试之后的得出,如果不是void,返回的是最后一个加入委托的返回值

代码:

using System;


namespace DelegationText
{
    class Program
    {

        //1. 委托的声明
        delegate void Judge(bool x);
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Judge judge = new Judge(One_two);
            bool Y_N = true;

            //将新的函数添加到委托里面
            judge += new Judge(Two_Three);
            judge += new Judge(Three_Four);
            judge(Y_N);

            


            Console.Read();
        }

        public static void  One_two(bool judge)
        {
            if(1 == 2)
            {
                judge = true;
            }
            else
            {
                judge = false;
            }
            Console.WriteLine("1、2" + judge);
            
        }
        public static void Two_Three(bool judge)
        {
            if(3 == 4)
            {
                judge = true;
            }
            else
            {
                judge = false;
            }
            Console.WriteLine("2、3" + judge);

        }

        public static void Three_Four(bool judge)
        {
            if(3 == 4)
            {
                judge = true;
            }
            else
            {
                judge = false;
            }

            Console.WriteLine("3、4" + judge);
        }
    }
}

但是你有没有考虑过,对于委托而言,我根本就不用这么麻烦,我想要使用什么函数直接传参使用就好了为什么要这么麻烦呢?
这就要考虑到委托的优点了:解耦、对修改关闭、对扩展开放、逻辑分离
借用s1314_JHC的博客部分观点来解释这些优点
再两个类中,我们假设主函数再类A红,而我们想用的函数Pre1()和Pri2在类B中,如果A想要调用B的方法,需要在A类中将B类实例化,然后通过B.Pre1()来调用,这样的会导致两个类的耦合性很高,如果类B发生较大的改变,那么可能会影响A的使用,使用委托就可以进行解耦;
具体怎么实现的呢?我们在A中并不需要直接调用B的函数方法,也不用关心B的函数方法是怎么实现,怎么编程的,只需要设定固定的方法签名即可,这样不管B怎样修改只要他的方法签名没有修改我们就可以得到正确的返回结果,这就是对修改关闭,逻辑分离,至于扩展性的话,我们可以通过+=、-=在委托中添加或者移除函数方法,而且什么时候想要添加就可以直接添加。

还有一点,委托可以实现动态地赋给参数的做法,避免在程序中大量使用If-Else(Switch)语句。

以上仅仅是个人理解,描述的不正确请多见谅欢迎指正~

发布了67 篇原创文章 · 获赞 3 · 访问量 1907

猜你喜欢

转载自blog.csdn.net/lfanyize/article/details/103128024