几乎所有C#Excel interop的在线示例代码都有这样的内容:
monthlyChartRange = _xlSheetChart.get_Range("A3", "C4");
然而,Resharper对此嗤之以鼻并要求:"使用索引属性"如果你赞同它的愿望(我喜欢R#,所以我总是说,"如你所愿"),它将其改为:
monthlyChartRange = _xlSheetChart.Range["A3", "B4"];
为什么呢? Range如何比get_Range更好?前者如何比后者更加索引?
答案 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感知客户端语言(如VB6; VBA; .NET)将允许您像这样与对象进行交互:
string thing = myObject.Item[2];
这些语言看到此特定属性为propget
但它需要in
参数。标记为DISPID_VALUE
的事实相当令人讨厌,因为它告诉COM客户端它是默认属性。将两个和两个放在一起,客户将意识到它必须是一个花花公子的索引属性,以便他们可以使用groovy方括号。
重要的是要意识到这只是糖语法。这是调用默认索引属性的更方便的方法。在幕后,它将根据不符合要求的语言调用相同的COM属性getter方法,如下所示。
一些编程语言(比如Visual Objects 2.6),当他们看到一个带有参数的COM属性时,它会吓坏(当我使用VO时我又吓坏了),因此它回退到基本的方法声明,它基本上处理它它作为一个方法调用,它接受一个索引参数并返回一个字符串:
string thing = myObject.get_Item(2) // Boo!
这些客户可能还错过了该属性被标记为DISPID_VALUE
的重要事实。
现在使用c#,你可以自由地使用方法风格的操作来查询属性,或者像COM一样设计并使用索引属性表示法。
毕竟,c#是OO;理解财产;理解索引器所以为什么不使用它们?
因此,为什么Resharper会提示您使用COM首选索引样式。这与使用常规c#类的方式没有什么不同。