C#学习(一) 委托

    技术2026-08-12  10

    学习视频:视频地址

    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
    Processed: 0.010, SQL: 9