.NET程序员面试指南:解释委托的基本原理

本文深入浅出地介绍了.NET中委托的基本原理及其应用场景。委托类似于安全的函数指针,用于回调指定方法,有助于设计更为优雅的面向对象程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请解释委托的基本原理
本文节选自《.NET程序员面试指南》一书

面试中这样的问题偶尔会出现,提问这样的问题,面试官主要意图是为了考查应聘者对.NET特性的了解。这样的细节问题很容易被程序员忽略,读者应该在平时学习的过程中注意积累。
所涉及到的知识点
• 委托的基本原理
• 委托类型继承结构
分析问题
委托这一概念对于有过C++经验的程序员来说并不陌生,C++中的函数指针和委托确实非常类似,很多程序员也很喜欢把.NET中的委托称呼为安全的函数指针,无论这一说法是否正确,但委托确实实现了和函数指针非常类似的功能,那就是提供了程序回调指定方法的机制。
在委托的内部,包含了一个指向某个方法的指针,在这一点上,委托的实现机制和C++的函数指针完全相同。之所以称委托是安全的,是因为委托和其他所有的.NET成员一样,是一种类型,任何委托对象都是System. Delegate的某个派生类的一个对象,在.NET框架中,任何自定义的委托都继承自祖父类System.Delegate。在这个类中,定义了大部分委托的特性,而关于System.MulticastDelegate的特性,将在后续章节中有所覆盖。现在来分析一个具体的例子。
代码6-1 一个简单的委托:SimpleDelegate.cs
using System;
namespace NET.MST.Sixth.SimpleDelegate
{
class SimpleDelegate
{
/// <summary>
/// 定义的委托。
/// </summary>
/// <param name="i">接受一个整型参数</i>
public delegate void TestDelegate(int i);
static void Main(string[] args)
{
//调用委托方法
TestDelegate d = new TestDelegate(PrintMessage1);
d(0);
d(1);
Console.Read();
}
/// <summary>
/// 一个静态方法,符合TestDelegate的定义
/// </summary>
/// <param name="i">整型参数</param>
static void PrintMessage1(int i)
{
Console.WriteLine("第" + i + "个方法");
}
}
}
在代码6-1中,首先通过public delegate void TestDelegate(int i);定义了一种名为TestDelegate的新类型,该类型继承自System.MulticastDelegate。而且它会包含一个名为Invoke的方法,该方法接受一个整数型的参数并没有任何返回。这些步骤都是由C#编译器自动完成的。
然后,申明了一个TestDelegate的对象d,并且绑定了一个静态的方法void PrintMessage1(int i)到该委托上。在这里读者需要注意的是,委托既可以接受实例方法,也可以接受静态方法,其中的内在区别将在本章后文中有所覆盖。最后,也是最令人期待的部分,d被调用执行:d(0); d(1); 在这里读者可能会对这个形式的代码产生困惑,事实上,这只是C#设计者们为了简化程序员的输入而设计的一种语法而已。
本质上,委托的调用就是执行了在定义委托时所生成的Invoke方法。
为了容易理解,读者完全可以尝试把委托的调用部分写成如下形式:
d.Invoke(0);
d.Invoke(1);
当执行委托时,.NET检查委托对象并找到PrintMessage1(int i)方法,然后把参数传递给该方法并且执行。
下面是这段小程序的执行结果:
第0个方法
第1个方法
答案
委托是一类继承自System.Delegate的类型,每个委托对象至少包含了一个指向某个方法的指针,该方法可以是实例方法,也可以是静态方法。委托实现了回调方法的机制,能够帮助程序员设计更加简洁优美的面向对象程序。

13164110_200811270929021.jpghttp://www.china-pub.com/508880
}J J l/m8rsm13164110
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值