C#委托

委托简介:

  1. 委托从字面意思理解,可以理解为代理,通俗将找人代替你干活
  2. 委托是一种引用类型,虽然在定义委托时与方法有些相似,但不能将其称为方法
  3. 从数据结构来讲,委托是和类一样是一种用户自定义类型
  4. 委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址
  5. 调用委托的时候,委托包含的所有方法将被执行
基本用法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 委托
{
    public class Program
    {
        //修饰符  delegate  返回值类型  委托名 ( 参数列表 );
        public delegate void MyDelegate();
        static void Main(string[] args)
        {
            //在委托中应用静态方法,类名.方法
            MyDelegate MyDel = new MyDelegate(Test.SayHello);

            //在委托中应用实例化方法
            MyDelegate myDel1 = new MyDelegate(new Test().SayHello1);
            MyDel();
            myDel1();
            Console.ReadKey();
        }
        public class Test
        {
            //静态方法static
            public static void SayHello()
            {
                Console.WriteLine("hello world");
            }

            //非静态方法
            public void SayHello1()
            {
                Console.WriteLine("hello world1");
            }
        }
    }
}

多播委托:

  1. 在 C# 语言中多播委托是指在一个委托中注册多个方法,在注册方法时可以在委托中使用加号运算符或者减号运算符来实现添加或撤销方法
  2. 在现实业务中,多播委托的实例是随处可见的,例如某点餐的应用程序,既可以预定普通的餐饮也可以预定可乐、鲜花、药物、快餐等等商品
    3. 在使用多播委托时需要注意,在委托中注册的方法参数列表必须与委托定义的参数列表相同,否则不能将方法添加到委托上。
多播委托
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 多播委托
{
    internal class Program
    {

        class Order
        {
            //委托的方法都注册给一个委托对象时,所有方法的参数列表必须相同
            public void ByCola(string str)
            {
                Console.WriteLine("{0}", str);
            }

            public void ByFlower(string str)
            {
                Console.WriteLine("{0}", str);
            }

            public void ByDrug(string str)
            {
                Console.WriteLine("{0}", str);
            }
        }

        //定义一个帮忙购买商品的委托
        public delegate void MyOrderDelegate(string str);
        public static void print(MyOrderDelegate[] orderdelegate)
        {

            string[] goods = { "鲜花", "感冒药", "可乐" };
            for (int i = 0; i < orderdelegate.Length; i++)
            {
                orderdelegate[i](goods[i]);
            }


        }
        static void Main(string[] args)
        {
            //实例化购买商品的委托,在委托时注册方法时,方法的参数列表必须与委托的参数列表相同,且多个方法必须拥有相同的参数列表,否则无法注册给一个委托实例
            MyOrderDelegate[] orderdelegate = { new MyOrderDelegate(new Order().ByFlower), new MyOrderDelegate(new Order().ByDrug), new MyOrderDelegate(new Order().ByCola) };
            print(orderdelegate);
            Console.ReadKey();

        }


    }
}

匿名委托:
1. 使用匿名委托时并没有定义方法,而是在实例化委托时直接实现了具体的操作
2. 由于匿名委托并不能很好地实现代码的重用,匿名委托通常适用于实现一些仅需要使用一次委托中代码的情况,并且代码比较少

匿名委托
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 匿名委托
{
    internal class Program
    {
        //修饰符  delegate  返回值类型  委托名 ( 参数列表 );
        public delegate void MyDelegate(double length, double width);

        static void Main(string[] args)
        {
            Console.WriteLine("请输入长");
            double length = double.Parse(Console.ReadLine());
            Console.WriteLine("请输入宽");
            double width = double.Parse(Console.ReadLine());
            //定义匿名委托
            /*
             注意结尾分号
             委托名  委托对象 = delegate
            {
                //代码块
            };  
             */
            MyDelegate MyDelegate = delegate
            {
                Console.WriteLine("面积为:{0}", length * width);
            };
            //执行委托
            MyDelegate(length, width);
            Console.ReadKey();
        }

    }
}

posted @ 2022-06-09 23:15  hpc_for_s  阅读(45)  评论(0)    收藏  举报