zoukankan      html  css  js  c++  java
  • c#委托(Delegates)--基本概念及使用

     在我这菜鸟理解上,委托就是可以用方法名调用另一方法的便捷方法,可以简化switch等语句的重复。最近做项目的时候恰好需要用到委托,便来复习及学习委托的使用。嗯...本人以前并没有用过,只是稍微知道而已。以下是整理的笔记。

    一.委托的概念

        委托是用户自定义的类,它定义了方法的类型。储存的是一系列具有相同参数和返回类型方法的地址列表,调用委托时,此委托列表的所有方法都将被执行。

    二.委托类型的定义

    委托类型必须在被用来创建变量以及类型对象之前声明。

    委托类型的声明:

    1.以delegate关键字开头。

    2.返回类型+委托类型名+参数列表

    delegate void MyDel(int a)


    三.实例

    1)现在我们先创建了控制台程序,进行简单的实例

    namespace Func
    {
        public delegate void MyDel();//声明一个自定义委托
        class Program
        {
            static void Main(string[] args)
            {
                MyDel say1 = SayHi;
                MyDel say2 = new MyDel(SayHi);
                say1();
                say2();
            }
            static void SayHi()
            {
                Console.WriteLine("hi");
            }
        }
    }

    2)扩展实例

    namespace Func
    {
        public delegate int MyDel(int num);//声明一个自定义委托
        class Program
        {
            static int Add1(int a)
            {
                int b = 10 + a;
                Console.WriteLine("——Add1———");
                return b;
     
            }
     
            static int Add2(int a)
            {
                int b = 10 - a;
                Console.WriteLine("——Add2———");
                return b;
     
            }
     
            static void Calculate(MyDel ex, int a)
            {
                var result = ex(a);
                Console.WriteLine(result + "
    ");
            }
     
            static void Main(string[] args)
            {
                Calculate(Add1, 1);
                Calculate(Add2, 10);
                Console.ReadKey();
            }
        }
    }

    结果如下图

    上面实现了“把方法当作参数在另一个方法中传递或调用”;从上面可以看出,调用的方法和委托的返回类型,参数类型都必须一致。

    我我们可以把委托作为参数传递给封装好了的方法,通过委托来动态的调用方法。

    四.委托的加减运算


    可以使用+=运算符,为委托新增方法。

    同样可以使用-=运算符,为委托移除方法。

    当委托列表中有几个方法时,调用委托时,则会依次经过各个方法,并返回列表最后一项方法的结果。

    namespace Func
    {
        public delegate int MyDel(int num);//声明一个自定义委托
        class Program
        {
     
            static int Add1(int a)
            {
                int b = 10 + a;
                Console.WriteLine("——Add1———");
                return b;
     
            }
     
            static int Add2(int a)
            {
                int b = 10 - a;
                Console.WriteLine("——Add2———");
                return b;
     
            }
     
            static void Calculate(MyDel ex, int a)
            {
                var result = ex(a);
                Console.WriteLine(result + "
    ");
            }
     
            static void Main(string[] args)
            {
                //Calculate(Add1, 1);
                //Calculate(Add2, 10);
                MyDel myDel = Add1;
                myDel += Add2;
                Calculate(myDel, 10);
                Console.ReadKey();
            }
        }
    }

    结果如下图:

    那么有时候我们需要返回每个方法的结果,此方法就不适用了,那怎么才能实现每个方法的返回结果都可以获取到呢?后续再写了。今天就简单的介绍了委托的基本概念和使用。

    五、泛型委托

    泛型的委托,就是然参数的类型不确定,例如代码改写为:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace TestApp
    {
        /// <summary>
        /// 委托
        /// </summary>
        /// <param name="s1"></param>
        /// <param name="s2"></param>
        /// <returns></returns>
        public delegate string ProcessDelegate<T,S>(T s1, S s2);
    
        class Program
        {
            static void Main(string[] args)
            {
                /*  调用方法  */
                ProcessDelegate<string,int> pd = new ProcessDelegate<string,int>(new Test().Process);
                Console.WriteLine(pd("Text1", 100));
            }
        }
    
        public class Test
        {
            /// <summary>
            /// 方法
            /// </summary>
            /// <param name="s1"></param>
            /// <param name="s2"></param>
            /// <returns></returns>
            public string Process(string s1,int s2)
            {
                return s1 + s2;
            }
        }
    }

    输出的结果就是:
    Text1100

    泛型的详细内容不属于本文的介绍范围,这里不加多说了。

  • 相关阅读:
    iframe中的页面如何触发父页面事件
    js获取gridview的值
    不出现重复数字,带干扰的验证码
    文本框内不允许输入字母
    后台调用前台JS方法
    在后台得到前台元素,给元素改变属性值或添加属性
    C#常见面试题
    Flex代码生成器 (FCG)
    c#(WinForm)遍历局域网计算机(电脑)获取IP和计算机名称
    VisualSVN Server + Tortoise SVN 使用教程(补充版)
  • 原文地址:https://www.cnblogs.com/Im-Victor/p/11412817.html
Copyright © 2011-2022 走看看