C#委托笔记

委托好像是C指针的升级版,可以定向到一个方法的位置

    //委托的实际运用
            Calculator ca = new Calculator();
            Action action = new Action(ca.Report);
            action.Invoke();//委托调用方法
            action();
            ca.Report();
            //对于有参数的委托的运用
            Func<int, int, int> func1 = new Func<int, int, int>(ca.Add);
            Func<int, int, int> func2 = new Func<int, int, int>(ca.Sub);
            int x = 100;
            int ys = 200;
            int z = 0;
            z = func1.Invoke(x,ys);
            Console.WriteLine(z);
  class Calculator
    { 
    public void Report()
        {
            Console.WriteLine("I hava die");
        }


        public int Add(int a ,int b)
        {
            int result = a + b;
            return result;
        }


        public int Sub(int a,int b)
        {
            int result = a - b;
            return result;
        }
    }

看起来就是用了INvoke这个方法间接调用其他方法,就是Action是无参方法,Func是调用有参的

自定义委托

自定义委托///
    public delegate double Calc(double x, double y);

委托的声明要与类的方法和返回值类型相同
在这里插入图片描述

  //对于委托的运用
            Calculators calculators = new Calculators();
            Calc calc1 = new Calc(calculators.Add);
            Calc calc2 = new Calc(calculators.Mul);
            Calc calc3 = new Calc(calculators.Sub);
            double a = 100;
            double b = 200;
            double c2 = 0;
            c2 = calc1.Invoke(a, b);
            Console.WriteLine("自定义泛型1的结果是" + c2);

            c2 = calc2.Invoke(a, b);
            Console.WriteLine("自定义泛型2的结果是" + c2);

            c2 = calc3.Invoke(a, b);
            Console.WriteLine("自定义泛型3的结果是" + c2);

 class Calculators
    {
        public double Add(double x,double y)
        {
            return x + y;
        }

        public double Sub(double x,double y)
        {
            return x - y;
        }

        public double Mul(double x,double y)
        {
            return x * y;
        }

    }

下面来看看委托的实际运用————作为参数调用方法


            ///泛型的实际调用 ///


            ProductFactory productFactory = new ProductFactory();
            WrapFactory warpfactory = new WrapFactory();

            Func<Product> func12 = new Func<Product>(productFactory.MakePizza);
            Func<Product> func22= new Func<Product>(productFactory.MakeTocar);

            Box box1 = warpfactory.WrapProduct(func12);
            Box box2 = warpfactory.WrapProduct(func22);

            Console.WriteLine(box1.Product.Name);
            Console.WriteLine(box2.Product.Name);
class Product   {
            public string Name { get; set; }
        }

        class Box
        {
            public Product Product { get; set; }
        }


        class  WrapFactory
        {
            public Box WrapProduct(Func<Product> getProduct)
            {
                Box box = new Box();

                Product product = getProduct.Invoke();
                box.Product = product;
                return box;
            }
        }


        class ProductFactory
        {
            public Product MakePizza()
            {
                Product product = new Product();
                product.Name = "Pizza";
                return product;
            }


            public Product MakeTocar()
            {
                Product product = new Product();
                product.Name = "Tot Car";
                return product;
            }
        }

看起来很麻烦
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值