C#学习(一) 委托

学习视频:视频地址

1. 函数指针

如在 C 中定义一个指向某个函数的函数指针:
1.声明:typedef int (* Calc)(int a, int b);
2.指向函数:Calc funcPoint1=&Add;
3.调用该指针函数:z=funcPoint1(x,y); 
  • C# 的委托类似于C中的函数指针

2.C#中的委托

Action委托:无返回值的
Func 委托:有返回值的

在这里插入图片描述
自定义委托 delegate:模板方法、回调方法

  • 模板方法:实现了代码的重复使用
//模板方法
 static void Main(string[] args)
        {
            ProductFactory productFactory = new ProductFactory();
            WrapFactory wrapFactory = new WrapFactory();

            Func<Product> func1 = new Func<Product>(productFactory.MakePizza);
            Func<Product> func2 = new Func<Product>(productFactory.MakeCar);

            Box box1=wrapFactory.WrapProduct(func1);
            Box box2 = wrapFactory.WrapProduct(func2);

            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 MakeCar()
        {
            Product product = new Product();
            product.Name = "Car";
            return product;
        }
    }
  • 回调方法
//回调方法
static void Main(string[] args)
        {
            ProductFactory productFactory = new ProductFactory();
            WrapFactory wrapFactory = new WrapFactory();

            Func<Product> func1 = new Func<Product>(productFactory.MakePizza);
            Func<Product> func2 = new Func<Product>(productFactory.MakeCar);

            Logger logger = new Logger();
            Action<Product> log = new Action<Product>(logger.Log);


            Box box1=wrapFactory.WrapProduct(func1, log);
            Box box2 = wrapFactory.WrapProduct(func2, log);

            Console.WriteLine(box1.Product.Name);
            Console.WriteLine(box2.Product.Name);


        }
    }

    class Logger
    {
        public void Log(Product product)
        {
            Console.WriteLine("Product'{0}' created at {1}.Price is {2}", product.Name, DateTime.UtcNow, product.Price);
        }
    }

    class Product
    {
        public string Name { get; set; }
        public double Price { get; set; }

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

    }

    class WrapFactory
    {
        public Box WrapProduct(Func<Product> getProduct,Action<Product> logCallback)
        {
            Box box = new Box();
            Product product = getProduct.Invoke();
            if (product.Price > 50) { logCallback.Invoke(product); }
            box.Product = product;
            return box;
        }
    }

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

        public Product MakeCar()
        {
            Product product = new Product();
            product.Name = "Car";
            product.Price=100;
            return product;
        }
    }

3.委托与线程

3.1 单播委托与多播委托

在这里插入图片描述

3.2 隐式异步调用

  • 异步与同步: 异步指同时让程序进行几个任务
    在这里插入图片描述
    在这里插入图片描述

3.3 进程与线程

	进程:每一个运行的程序即为一个进程
	线程:每个进程可以有多个线程
	同步=>同一线程内,异步=>多线程

串行<=>同步<=>单线程;并行<=>异步<=>多线程

4.接口

//接口
static void Main(string[] args)
        {
            //接口:无方法级别的耦合,可以用接口来取代委托
            IProductFactory pizzaFactory = new PizzaFactory();
            IProductFactory carFactory = new CarFactory();
            WrapFactory wrapFactory = new WrapFactory();

            Box box1=wrapFactory.WrapProduct(pizzaFactory);
            Box box2 = wrapFactory.WrapProduct(carFactory);

            Console.WriteLine(box1.Product.Name);
            Console.WriteLine(box2.Product.Name);


        }
    }


    interface IProductFactory
    {
        Product Make();


    }

    class PizzaFactory : IProductFactory
    {
        public Product Make()
        {
            Product product = new Product();
            product.Name = "Pizza";
            product.Price = 12;
            return product;
        }
    }

    class CarFactory : IProductFactory
    {
        public Product Make()
        {
            Product product = new Product();
            product.Name = "Car";
            product.Price = 100;
            return product;
        }
    }

    class Product
    {
        public string Name { get; set; }
        public double Price { get; set; }

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

    }

    class WrapFactory
    {
        public Box WrapProduct(IProductFactory productFactory)
        {
            Box box = new Box();
            Product product = productFactory.Make();
            box.Product = product;
            return box;
        }
    }s

猜你喜欢

转载自blog.csdn.net/chaoge_dgqb/article/details/107133571