委托学习总结(一)浅谈对C#委托理解

初入社会,对于我这个初级程序员来讲要学的东西实在太多了,公司最近在作一个winform框架开发的桌面应用程序,众所周知,winform也好,webform也好,里面随处可见的事件驱动,有事件,固然也少不了委托,感受以前对委托这个概念的理解一直是模模糊糊的,口里都会背的那么几句话:“委托能够把方法看成参数在另外一个方法中传递和调用”,“委托是方法的快捷方式”等等。可是真要深刻理解,灵活运用,仍是要有良好的代码理解功底和面向对象基础的,今天就再来把委托这个知识梳理梳理,以加深对它的理解。程序员

要理解委托,咱们首先要知道委托的概念:web

”委托是一个类,它定义了方法的类型,使得能够将方法看成另外一个方法的参数来进行传递,这种将方法动态地赋给参数的作法,能够避免在程序中大量使用If-Else(Switch)语句,同时使得程序具备更好的可扩展性。“编程

这是百度上和许多教科书上都有的一个概念,可是初学这门编程语言的话,或者基础比较差的童鞋,看到这句话,确定是一脸懵比,先不用着急,咱们来慢慢经过代码去理解委托这个概念框架

(1)首先新建一个控制台程序,对于初学者而言,控制台程序是学习基础知识的最好工具编程语言

//delegate void EvenHandler(object sender, EventArgs e);
    public delegate void MyDel();//自定义一个委托
    class Program
    {
        static void Main(string[] args)
        {
            //(1)简单委托
            MyDel say1 = SayHi;
            MyDel say2 = new MyDel(SayHi);
            say1();
            say2();
        }
        static void SayHi()
        {
            Console.WriteLine("Hi World");
        }
    }

这是最简单的委托实例了,委托能够经过上面say1和say2两种方式进行调用,这里咱们要知道委托也是一种类型,因此它和类是同级的,能够经过委托来掉用方法,不要误觉得委托和方法同级的,方法只是类的成员,还有定义委托和与之对应的方法必须具备相同的方法签名,即参数个数,类型相同,返回值类型相同,上面代码实例没有什么实际意义,只是然咱们知道委托的结构以及委托与方法的关系ide

(2)委托的扩展工具

//自定义一个委托
        public delegate int Expression(int a, int b);
        class Program
        {
            static void Main(string[] args)
            {
                //(2)委托扩展
                //Expression ex = GetEX;
                //Calculate(ex, 25, 10);
                Calculate(GetAdd, 25, 10);
            }
            static int Add(int a, int b)
            {
                return a + b;
            }
            static int Divide(int a, int b)
            {
                return a / b;
            }
            static int subtract(int a, int b)
            {
                return a - b;
            }
            static int multiply(int a, int b)
            {
                return a * b;
            }
            static int GetAdd(int a, int b)
            {
                return a + b;
            }
            static void Calculate(Expression ex, int a, int b)
            {
                Console.WriteLine(ex(a, b) + "\n");
            }
        }

和以前比,稍微把代码复杂了那么一点点,上面咱们真正实现了“把方法看成参数在另外一个方法中传递或调用”,实现了一个简单的加法方法,固然咱们也写了减法,乘法,除法的方法。你会想这样写有什么好处呢?我直接调用本身的加减乘除方法不就完了吗,何须要画蛇添足,经过委托来折腾一番呢?委托的意义何在呢?在这里请先听我先说一种思想:“上面的Calculate方法里面代码比较少,只有一个简单的输出语句,并且咱们只想单纯的实现一个简单加减乘除效果,因此你会感受有点屡次一举,也能够说原本就是屡次一举,可是你能够设想一下,假如咱们这几个加减乘除方法,它的代码量很是庞大,可是这几个方法的代码类似度又很是高,可是每一个方法里就只有一两个小小的语句块儿不同,那不是会让你以为很不爽,很想把它们整合,那怎么处理呢?你可能首先会想经过if,else if或者switch语句对不一样部分的代码块作不一样的处理,如今我只须要作加减乘除四个case,这个思路暂且能够接受,那未来我又要加余数运算,平方运算,指数对数运算等等,假设我几百个甚至更多个这样相似的方法呢,那我岂不是要写几百个if,else,这样作很明显程序的扩展性会不好。因此咱们要换个思路,咱们彻底能够经过一个方法把相同的部分封装起来,而不一样的部分经过参数传过去,可是方法并不能直接被看成参数被传递和调用,那怎么办呢?,那么这时候委托的做用就体现出来了,咱们能够把委托做为参数传递给封装好了的方法,经过委托来动态的调用方法。”  结合我所说的思想,那么上面封装的部分就相似与咱们的Calculate方法,而不一样的部分就是每一个加减乘除方法,你能够假设Calculate是一个很是庞大的已经封装好了的方法,而咱们传进去的只是这个方法须要动态改变的部分,这样就是最上面概念所谓的“方法动态地赋给参数”,这样写到好处是大大提高了方法的灵活性与扩展性,也减小了代码的冗余,因此委托在实际项目中是一个十分有用的工具,它可使你的代码更加的”温馨,健壮“。是否是感受对委托的理解有那么一丢丢长进了,以后我还会继续写关于学习匿名方法,lambda表达式,泛型委托,以及事件的相关学习心得。以上言论是我本身参考资料,和项目实战后本身作出的总结,若是又什么不对的地方,但愿各位大神指出^^。学习

相关文章
相关标签/搜索