Resharper对Excel Interop中常用的getRange()有什么作用?

时间:2015-11-20 23:40:34

标签: c# excel-interop named-ranges indexed-properties resharper-9.2

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

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

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

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

为什么呢? Range如何比get_Range更好?前者如何比后者更加索引?

2 个答案:

答案 0 :(得分:1)

Resharper经过培训,可以使用属性而不是底层的Getter,因为它更容易阅读代码并且更像OO。该物业只是将吸气剂称为封闭物。

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

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

答案 1 :(得分:1)

  

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

一些介绍 - COM回过头来。您必须记住,COM是一种二进制协议,并且某些COM感知语言没有属性概念。

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

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

调度ID为DISPID_VALUE,通知客户端这是默认属性,通常用于索引属性。注意它是如何定义为属性get 的,但有趣的是它需要一个参数index。正如我们将要看到的那样,一个参数的属性获取器的概念可能会混淆一些编程语言。

完全符合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#是OO;理解财产;理解索引器所以为什么不使用它们?

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