学习视频:视频地址
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