委托的概念
委托是一种特殊的类型,可以保存方法
delegate RetType DelegateName(Type1 name1, Type2 name2);
关键字 delegate 用来定义委托,也翻译成代理
委托是一种类型,与 class 的地位是对等的
定义委托类型的变量
DelegateName myDelegation = new DelegateName(SomeMethod);
// 或者简写为
DelegateName myDelegation = SomeMethod;
可以赋予的变量是满足代理定义的方法,要求返回值和参数列表都一样
使用委托
很多时候,我们需要依情况调用不同的方法。传统思路是采用 if 判断,分支是比较拖效率的操作。
例子:分子结构模拟
在化学中,分子相互作用力有不同的势函数模型,这些函数的输入输出类型完全相同,仅计算过程不同
程序运行前,需要手动配置使用哪种势函数模型,程序运行时,势函数不会改变
一次模拟至少需要调用 1 亿次势函数
在化学领域,势函数模型还在不断更新,甚至有研究人员在做创新实验
使用委托
前提:有一组返回值以及参数类型都相同的方法
double Add(double a, double b)
double Subtract(double a, double b)
double Multiply(double a, double b)
定义一个委托,保证返回值与参数类型都匹配
delegate double SuperComputer(double a, double b)
定义委托类型的变量
SuperComputer sc = Add;
SuperComputer su = SomeClass.Subtract;
SuperComputer so = obj.Multiply;
委托会受制于访问修饰符,但是不限制来自于哪个类、哪个对象,也可以是 static 方法。仅需要方法返回值以及参数类型都相同。