委托-c#版

      1. 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
       2.方法并不能直接被当作参数被传递和调用
       3. 委托也是一种类型,所以委托和类是同级的,可以通过委托来掉用方法,不要误以为委托和方法同级的
      4.委托的定义: public delegate int 委托名(int a, int b);它的定义有这几个特点,(1)可以用访问修饰符修饰。(2)delegate关键字。(3)有返回值和参数。
        5.委托是一种类型,与之对应的方法必须和它具有相同的签名,即相同的参数个数,相同的参数类型和相同的返回值类型

       6.无返回值的委托,你给它注册多少个方法,它就执 行多少个方法,而有返回值的委托,同样注册多少个方法就执行多少个方法,但返回的是最后一个方法的返回值。

       7.使用-=最终是将委托置为null,为null另一个意思就是空引用,这样就可以等待垃圾回收器进行回收了

例1:

    class Program
    {
        private delegate void  Expression();
        static void Main(string[] args)
        {
            //Expression ex = new Expression(Add);也可以,但没有下面这种常用
            Expression ex = Add;
            Add();
            Console.ReadKey();
        }
        public static int a = 2;
        public static void Add()
        {
            Console.WriteLine(a + a); 
        }
    }

例2:

    class Program
    {
        public delegate void P();
        static void Main(string[] args)
        {

            P p = Person.Name ;
            p += Person.Age;
            p();
            Console.ReadKey();
        }
        
        public class Person
        {
            public static void Name()
            {
                Console.WriteLine("我是Zhangsan");
            }
            public static void Age()
            {
                Console.WriteLine(",今年20岁");
            }
        }
    }

 

例3:

 

    class Program
    {
        private delegate int Expression(int a, int b);
        static void Main(string[] args)
        {
            Calculate(Add, 1, 2);

            Console.ReadKey();
        }
        static int Add(int a, int b)
        {
            return a + b;
        }
        static int Divide(int a, int b)
        {
            return a - b;
        }
        static void Calculate(Expression ex, int a, int b)
        {
            Console.WriteLine(ex(a, b));
        }
    }

例四:

    class Program
    {
        private delegate int Expression(int a, int b);
        static void Main(string[] args)
        {
            Expression add = new Expression(Add);
            Expression divide = Divide;
            
            Console.WriteLine(add(1, 2));
            Console.WriteLine(divide(6, 2));

            Console.ReadKey();
        }
        static int Add(int a, int b)
        {
            return a + b;
        }
        static int Divide(int a, int b)
        {
            return a - b;
        }
    }

例五:(Action委托)

          Action是系统内置(预定义)的一个委托类型,它指向了一个没有返回值的方法。

 class Program
    {
        static void Main(string[] args)
        {
            Action a = PrintInt;
            Action<string> b = PrintString;
            Action<int, int> c = PrintTwoInt;

            a();
            b("你好");
            c(2,3);

            Console.ReadKey();
        }
        static void PrintInt()
        {
            Console.WriteLine("hello world");
        }
        static void PrintString(string str)
        {
            Console.WriteLine(str);
        }
        static void PrintTwoInt(int a,int b)
        {
            Console.WriteLine(a .ToString ()+ b.ToString ());
        }
    }

例六:(Func委托)

             Func是系统内置(预定义)的一个委托类型,它指向了带有一个返回值的方法。它可以传递0-16个参数类型,和一个返回值类型。

    class Program
    {
        static void Main(string[] args)
        {
            Func<int> a = Test1;//Func中的泛型类型指的是方法的返回值类型
            Func<string, int> b = Test2;//func后面可以跟很多类型,最后一个类型是返回值类型,前面的类型是参数类型,参数类型必须跟指定的方法的参数类型按照顺序对应
            Func<int, int, int> c = Test3;//func后面必须指定一个返回值类型,参数类型可以有0-16个,先写参数类型,最后一个是返回值类型

            a();
            b("你好");
            c(2,5);

            Console.ReadKey();
        }
        static int Test1()
        {
            return 1;
        }
        static int Test2(string str)
        {
            Console.WriteLine(str);
            return 100;
        }
        static int Test3(int i,int j)
        {
            return i + j;
        }
    }

实例:(猫捉老鼠,观察者模式,func)

猫类:

    class Cat
    {
        string name;
        public Cat (string name)
        {
            this.name = name;
        }
        public void CatComing()
        {
            Console.WriteLine(name + "来了");
            if(catcome !=null)
            {
                catcome();
            }
        }
        public Action catcome;
    }

老鼠类:

    class Mouse
    {
        string name;
        public Mouse (string name ,Cat cat)
        {
            this.name = name;
            cat.catcome += MouseRun;
        }
        public void MouseRun()
        {
            Console.WriteLine(name + "开始跑了");
        }
    }

客户端:

    class Program
    {
        static void Main(string[] args)
        {
            Cat cat1 = new Cat("汤姆猫");

            Mouse mouse1 = new Mouse("大老鼠",cat1 );
            Mouse mouse2 = new Mouse("小老鼠",cat1 );

            cat1.CatComing();
            Console.ReadKey();
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值