刘铁猛《C#语言入门详解》019 委托详解
什么是委托delegate
委托是函数指针的升级版
举例说明:C/C++中的函数指针
程序员常提及的概念:一切皆地址
1)变量(数据)是以某个地址为起点的一段内存中所存储的值
解释:数据存储在变量中,变量的本质:以变量名所对应的内存地址为起点的一段内存[存储着变量的数据],内存的大小由数据类型决定
2)函数(算法)是以某个地址为起点的一段内存中所存储的一组机器语言指令
函数的本质:以函数名所对应的内存地址为起点的一段内存,在这段内存中存储的是一组机器语言的指令,CPU按照这组指令一条一条完成
3)直接调用&间接调用
1)直接调用:通过函数名调用函数,CPU通过函数名直接获得函数的地址并开始执行 返回
2)间接调用:通过函数指针调用函数,CPU通过读取函数指针中存储的值获得函数的地址并开始执行 返回
模板方法案例
namespace DelegateExample
{
class Program
{
static void Main(string[] args)
{
ProductFactory productFactory = new ProductFactory();
WarpFactory warpFactory = new WarpFactory();
Func<Product> func1 = new Func<Product>(productFactory.MakePizza);
Func<Product> func2 = new Func<Product>(productFactory.MackToyCar);
Box box1 = warpFactory.WarpProduct(func1);
Console.WriteLine(box1.Product.Name );
Box box2 = warpFactory.WarpProduct(func2);
Console.WriteLine(box2.Product.Name);
Console.ReadLine();
}
}
class Product
{
public string Name { get; set; }
}
class Box
{
public Product Product { get; set; }
}
class WarpFactory
{
public Box WarpProduct(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 MackToyCar()
{
Product product = new Product();
product.Name = "ToyCar";
return product;
}
}
}