注释
此内容由 Pearson Education, Inc. 的许可从 框架设计指南:可重用 .NET 库的约定、习惯和模式(第 2 版)重新打印。 该版于2008年出版,此后该书已于 第三版全面修订。 此页上的一些信息可能已过期。
回调是允许框架通过委托回调到用户代码的扩展点。 通常通过方法的参数将这些委托传递到框架。
事件是回调的一种特例,它支持便捷且一致的语法,用于提供委托(事件处理程序)。 此外,Visual Studio 的语句完成和设计器还提供了有关使用基于事件的 API 的帮助。 (请参阅 事件设计。)
✔️ 请考虑使用回调来允许用户提供框架要执行的自定义代码。
✔️ 请考虑使用事件来允许用户自定义框架的行为,而无需了解面向对象的设计。
✔️ 请务必首选使用事件而非普通回调,因为它们对于更广泛的开发人员来说更熟悉,并且与 Visual Studio 语句完成进行了集成。
❌ 避免在性能敏感的 API 中使用回调。
✔️ 在定义带有回调的 API 时,请使用新的Func<...>、Action<...>或Expression<...>类型,而不是自定义委托。
Func<...> 和 Action<...> 表示泛型委托。 Expression<...> 表示可以在运行时编译和随后调用的函数定义,但也可以序列化并传递给远程进程。
✔️ 请务必衡量并了解使用 Expression<...>(而不是使用 Func<...> 和 Action<...> 委托)对性能的影响。
Expression<...> 类型在大多数情况下在逻辑上等效于 Func<...> 和 Action<...> 委托。 它们之间的主要区别在于委托旨在用于本地流程场景,而表达式适用于在远程进程或计算机中对该表达式求值是有益的且可能的情况。
✔️ 务必理解,通过调用委托,你正在执行任意代码,并且这可能会导致安全性、正确性和兼容性方面的问题。
部分内容 © 2005, 2009 Microsoft 公司。 保留所有权利。
获得皮尔逊教育公司许可后重印自 框架设计准则:可重用 .NET 库的约定、习惯和模式 ,由 Krzysztof Cwalina 和 Brad Abrams 编写,并作为微软 Windows 开发系列中的出版物之一,于 2008 年 10 月 22 日由 Addison-Wesley Professional 出版。