Resharper 与 Excel Interop 中常用的 getRange() 有什么区别?

What does Resharper have against the commonly-used getRange() in Excel Interop?

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

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

然而,Resharper 对它嗤之以鼻并要求:"Use indexed property" 如果你同意它的意愿(我喜欢 R#,所以我总是说,"As you wish"),它会改变它至:

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

为什么? Range 比 get_Range 好在哪里?前者如何比后者更索引?

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

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

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

Yet, Resharper turns up its nose at it and demands: "Use indexed property"

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

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

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

调度 ID 是 DISPID_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 时我又会惊慌失措),因此它会回退到底层方法声明,它本质上将其视为采用索引参数和 returns 字符串的方法调用:

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

这些客户可能还忽略了 属性 被标记为 DISPID_VALUE 的重要事实。

现在使用 C#,可以说您可以自由使用 方法样式 操作来查询 属性 或按照 COM 的设计并使用索引 属性 符号。

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

这就是 Resharper 提示您使用 COM 首选索引样式的原因。这与您使用常规 c# class.

的方式没有什么不同