委托
2009-12-02 17:30 宗哥 阅读(312) 评论(0) 编辑 收藏 举报
委托定义:
委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。
OOP世界是个很有意思的世界,我们知道类(Class)是具有相同行为和特性的对象(Object)的抽象,对象(Object)是类(Class)的实例,如果你方法作为一个对象,那么抽象这些具有相同行为和特性(方法的签名)的类在哪里那?这就是委托。本质上委托是个类。
Delegate 类是委托类型的基类。然而,只有系统和编译器可以显式地从 Delegate 类或 MulticastDelegate 类派生。此外,还不允许从委托类型派生新类型。Delegate 类不是委托类型,该类用于派生委托类型。
定义委托:
public delegate int Calculate(int par1,int par2);
Refectlor其IL代码:
1 .class public auto ansi sealed Calculate
2 extends [mscorlib]System.MulticastDelegate
3 {
4 .method public hidebysig specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed
5 {
6 }
7 //……
8 }
9
2 extends [mscorlib]System.MulticastDelegate
3 {
4 .method public hidebysig specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed
5 {
6 }
7 //……
8 }
9
注意其Sealed了吗?
委托使用:
作为委托参数传递的方法必须与委托声明具有相同的签名.

方法签名:C#指方法参数(类型和修饰符号)和返回类型。
例如: Method Void(int par1) 和 Method1 Void(int par1)签名一致
Method int(int par1) 和 Method1 Void(int par1)签名不一致(方法名字和返回类型)
Method int(int par1) 和 Method Void(ref int par1)签名不一致(参数修饰符号)
例如: Method Void(int par1) 和 Method1 Void(int par1)签名一致
Method int(int par1) 和 Method1 Void(int par1)签名不一致(方法名字和返回类型)
Method int(int par1) 和 Method Void(ref int par1)签名不一致(参数修饰符号)
简单使用:
1 //定义委托计算两个数的返回结果
2 public delegate int Calculate(int par1,int par2);
3
4 class Program
5 {
6 static void Main(string[] args)
7 {
8 Calculate c = new Calculate(Add);
9 int calculateResult = c(1, 2);
10 Console.WriteLine("委托Calculate(Add)计算的结果{0}",calculateResult);
11 }
12
13 static int Add(int par1, int par2)
14 {
15 return par1 + par2;
16 }
17 }
2 public delegate int Calculate(int par1,int par2);
3
4 class Program
5 {
6 static void Main(string[] args)
7 {
8 Calculate c = new Calculate(Add);
9 int calculateResult = c(1, 2);
10 Console.WriteLine("委托Calculate(Add)计算的结果{0}",calculateResult);
11 }
12
13 static int Add(int par1, int par2)
14 {
15 return par1 + par2;
16 }
17 }
个委托被映射到Add方法,可以这么理解方法Add实例化了委托Calculate。委托delegate 的构造函数为:
作为参数传递:

public delegate int Calculate(int par1, int par2);
public class Calculater
{
Calculate instanceCalculate;
public Calculater(Calculate instanceDelegate)
{
this.instanceCalculate = instanceDelegate;
}
public int Calculate(int par1,int par2)
{
return instanceCalculate(par1, par2);
}
}
//调用
class Program
{
static void Main(string[] args)
{
Calculater c = new Calculater(Add);
int result = c.Calculate(1, 2);
Console.WriteLine("委托Calculate(Add)计算的结果{0}", result);
}
static int Add(int par1, int par2)
{
return par1 + par2;
}
}
public class Calculater
{
Calculate instanceCalculate;
public Calculater(Calculate instanceDelegate)
{
this.instanceCalculate = instanceDelegate;
}
public int Calculate(int par1,int par2)
{
return instanceCalculate(par1, par2);
}
}
//调用
class Program
{
static void Main(string[] args)
{
Calculater c = new Calculater(Add);
int result = c.Calculate(1, 2);
Console.WriteLine("委托Calculate(Add)计算的结果{0}", result);
}
static int Add(int par1, int par2)
{
return par1 + par2;
}
}
还记得模板设计模式吗?这个看以看做是模板方法的一种实现。
委托Calculate被实例化了Add,有点IOC/LSP?的味道。
声明: 本文作者:宗哥,宗子城
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明。 ...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述