0

几乎所有 C# Excel 互操作的在线示例代码都有这样的内容:

monthlyChartRange = _xlSheetChart.get_Range("A3", "C4");

然而,Resharper 对它嗤之以鼻并要求:“使用索引属性”如果你同意它的意愿(我喜欢 R#,所以我总是说,“如你所愿”),它将其更改为:

monthlyChartRange = _xlSheetChart.Range["A3", "B4"];

为什么?Range 比 get_Range 好多少?前者如何比后者更有索引?

4

2 回答 2

1

然而,Resharper 对它嗤之以鼻并要求:“使用索引属性”

有点介绍 - COM 可以追溯到很久以前。您必须记住,COM 是一种二进制协议,并且一些支持 COM 的语言没有属性的概念。

COM 索引属性通常定义如下:

[propget, id(DISPID_VALUE), helpstring("blah")]
HRESULT Item([in] long Index, [out, retval] BSTR* Item);

调度 IDDISPID_VALUE通知客户端这是通常用于索引属性的默认属性。请注意它是如何定义为属性 get但有趣的是它需要一个参数index。正如我们将看到的,接受参数的属性 getter 的概念可能会使某些编程语言感到困惑。

完全兼容 COM 的客户端语言

良好的 COM 感知客户端语言(例如 VB6;VBA;.NET)将允许您与对象进行交互,如下所示:

string thing = myObject.Item[2];

这些语言认为这个特定的属性是propget它所采用的参数和in参数。它被标记为的事实DISPID_VALUE相当吸引人,因为这告诉 COM 客户端它是默认属性。将两个和两个放在一起,客户会意识到它必须是一个漂亮的索引属性,以便他们可以使用 groovy 方括号。

重要的是要意识到这只是糖语法。这只是调用默认索引属性的一种更方便的方法。在幕后,它将根据不兼容的语言调用相同的 COM 属性 getter 方法,如下所示。

不太符合 COM 的客户端语言

一些编程语言(如 Visual Objects 2.6)在看到带有参数的 COM 属性时会吓坏(当我使用 VO 时我又会吓坏),因此它回退到底层方法声明,它本质上将其视为采用索引参数并返回字符串的方法调用:

string thing = myObject.get_Item(2)  //  Boo!

这些客户可能还错过了该物业被标记为的重要事实DISPID_VALUE

现在使用 c#,您可以自由地使用方法样式的操作来查询属性或按照 COM 的设计和使用索引属性表示法进行操作。

毕竟c#是面向对象的;了解属性;了解索引器,那么您为什么不使用它们呢?

因此,为什么 Resharper 会提示您使用 COM 首选的索引样式。这与使用常规 c# 类的方式没有什么不同。

于 2015-11-21T01:06:13.913 回答
1

Resharper 被训练为使用属性而不是底层的 Getter,因为它的代码更易于阅读并且更类似于 OO。该属性只是在幕后调用 getter。

Excel 自动化的 COM 端口刚刚暴露了 Getter,尽管这并不是真正的 OO-ish。

顺便说一句,我建议使用Aspose Cells而不是 Office 自动化。它快了十万亿倍。

于 2015-11-20T23:57:35.857 回答