3

在 C# 中为 Excel 编程时(使用 Excel 14.0 库),有几个接口具有相同的名称,但一个名称前有一个下划线。例如:

_Workbook
Workbook

_Worksheet
Worksheet

_Application
Application

etc

这背后的原因是什么,下划线表示什么?我看到的大多数示例代码都在调用带有下划线的接口名称。

4

4 回答 4

6

看看 MSDN。例如工作簿

[GuidAttribute("000208DA-0000-0000-C000-000000000046")]
public interface Workbook : _Workbook, 
    WorkbookEvents_Event 

因此Workbook使用来自WorkbookEvents_Event的方法扩展了 _Workbook,这意味着添加了许多事件处理程序 - 仅此而已。

其余接口类似。

于 2013-05-15T19:12:18.130 回答
3

这是 OLE 自动化中的一个旧约定,它表明接口类型应该对程序员隐藏。在脚本语言和 VB6 和 VBA 等语言中很常见,您使用 coclass 上的默认接口而不是接口类型。

于 2013-05-15T19:44:29.123 回答
2

扩展Garath 的观察,即 Workbook 是 _Workbook 和 WorkbookEvents_Event 的组合。

基本上,_Workbook 接口是 Excel 实现的,而 WorkbookEvents_Event 接口是它引发的事件。

在 COM 中,WorkbookEvents_Event 是一个源接口,实际上定义了客户端注册为事件接收器(也称为事件处理程序)的方法签名。Workbook 接口是将其联系在一起的实际 coclass(COM 类) - 该类公开 _Workbook 方法,并且是 WorkbookEvents_Event 的来源。

在 COM 中,_Workbook 接口将从对 IUnknown::QueryInterface(这是您与 Excel 交互的方式)的调用返回,而 WorkbookEvents_Event 将从 IConnectionPoint::GetConnectionInterface 返回。反过来,要订阅 Workbook 的“事件”(COM 中的连接点),您需要将 WorkbookEvents_Event 的实现传递给 IConnectionPoint::Advise,以便 Excel 在事件发生时调用。

当它被翻译成 .NET 时,这些源接口在很大程度上失去了它们的意义,变成了一个实现细节。强类型的委托简化了事情,COM 互操作自动化了任何死记硬背的接口魔法。

在大多数情况下,仅使用 Office 互操作(工作簿)的 coclass 接口就足够了,并且最接近 .NET 模型。但是请注意,我已经看到其他供应商建议使用实际的包装器(例如,WorkbookClass)而不是生成的接口(Workbook)来进行未来的版本控制。老实说,我(谢天谢地)从来没有考虑过任何一种方式的后果。

哦,下划线主要是一种约定,也是一种在给定类名的情况下生成 COM 接口名的便捷方式。VB6 将为具有该约定的类创建 COM 接口(例如,如果您有一个名为 Workbook 的类,它将导出一个 COM 接口 _Workbook),因为它是一个无效的 VB6 名称。通常,前导下划线是无效标识符 (VB6) 或保留 (C++),因此可以方便地自动生成名称。

于 2013-05-15T20:34:28.353 回答
-2

在编程中,访问器开头或结尾的下划线通常表示私有的、硬壳的 API。

于 2013-05-15T19:07:59.733 回答