zoukankan      html  css  js  c++  java
  • C#编程语言与面向对象——委托

    委托(delegate)也可以看成是一种数据类型,可以用于定义变量,但它是一种特殊的数据类型,所定义的变量能接收的数值只能是个函数,更确切地说,委托类型的变量可以接收一个函数的地址。

    简单地说

    委托变量可看成是一种类型安全的函数指针,他只能接收符合其要求的函数地址。

    示例:

    public class MathOpt
    {
        public int Add(int argument1,int argment2)
        {
            return argument1+argment2;
        }
    }
    
    public delegate int MathOptDelegate(int value1,int value2);
    
    class Program
    {
        static void Main(string[] args)
        {
            MathOptDelegate oppDel;
            MathOpt obj=new MathOpt();
            oppDel=obj.Add;
            Console.WriteLine(oppDel(1,2));
        }
    }

    委托变量接收一个对象的方法引用。赋值之后的委托变量可以当成普通函数一样使用。

    委托可以看成一个函数“容器”,将某一具体的函数“装入”后,就可以把它当成函数一样使用。

    定义委托类型时对函数的要求被称为函数的“签名(signature)”。

    函数的签名规定了函数的参数数目和类型,以及函数的返回值,体现了函数的本质特征。

    每个委托都确定了一个函数的签名。拥有不同签名的函数不能赋值给同一类型的委托变量。

    因此,委托类型的变量,可以引用任何一个满足其要求的函数。

    委托变量可以代表某一函数,使用委托变量就相当于调用一个函数,如果仅是这么简单。那么直接调用函数不就行了吗?为什么还要引入“委托”这一特性呢?

    事实上,委托不仅可以代表一个函数,还可以组合“一堆”函数,然后批量执行他们。

    如:

    //定义一个委托
    delegate void MyDalegate(string s);
    
    //定义一个类 存在两个静态方法
    class MyClass
    {
        public static void Hello(string s)
        {
            Console.WriteLine("您好,{0}!",s);
        }
        public static void GoodBye(string s)
        {
            Console.WriteLine("再见,{0}!",s);
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            MyDalegate a,b,c,d;
    
            //创建引用Hello方法的委托对象 a:
            a=MyClass.Hello;
            Console.WriteLine("调用委托变量 a:");
            a("a");
    
            //创建引用GoodBye方法的委托对象 b:
            b=MyClass.GoodBye;
            Console.WriteLine("调用委托变量 b:");
            b("b");
    //a和b两个委托成c c=a+b; Console.WriteLine("调用委托变量 c:"); c("c=a+b"); //从委托c中移除a,只留下b,用d代表移除结果 d=c-a; Console.WriteLine("调用委托变量 d:"); d("d=c-a");   } }

    因为上述代码中委托变量c组合了委托变量a和b,当执行“c“c(a+b)”;”时,导致MyClass的两个静态函数都被执行

    像c这种委托变量又称为“多路委托变量

    运行结果:

    调用委托变量 a:
    您好,a!
    调用委托变量 b:
    再见,b!
    调用委托变量 c:
    您好,c=a+b!
    再见,c=a+b!
    调用委托变量 d:
    再见,d=c-a!
  • 相关阅读:
    C#调用WebService实现天气预报
    火狐完整版下载地址
    Unity3D 中 2D_Toolkit插件下载 和 导入方法
    给大家分享个 网站头像上传的 插件
    JQuery工具方法,实例方法
    ireport5.6.0 win10打不开
    JFreeChart 零散
    JS 类继承 原型继承
    技术电子书下载网址
    正则 变量替换
  • 原文地址:https://www.cnblogs.com/guyg/p/3892800.html
Copyright © 2011-2022 走看看