[英]What does Resharper have against the commonly-used getRange() in Excel Interop?
几乎所有在线C#Excel互操作示例代码都具有以下内容:
monthlyChartRange = _xlSheetChart.get_Range("A3", "C4");
然而,Resharper却不屑一顾并要求:“使用索引属性”如果您同意它的愿望(并且我喜欢R#,所以我总是说“如您所愿”),它将更改为:
monthlyChartRange = _xlSheetChart.Range["A3", "B4"];
为什么? Range比get_Range好吗? 前者比后者的索引如何?
Resharper经过训练可以使用属性而不是基础的Getter,因为它使代码更易于阅读且更类似于OO。 该物业只是在幕后称呼吸气剂。
Excel自动化的COM端口只是公开了Getter,即使这实际上不是那么简单。
顺便说一句,我建议使用Aspose Cells代替Office自动化。 速度快了十万亿倍。
然而,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
的事实DISPID_VALUE
因为它告诉COM客户端它是默认属性。 将两个和两个放在一起,客户将意识到它必须是一个花哨的索引属性,以便他们可以使用普通的方括号。
重要的是要意识到这只是糖语法 。 这只是调用默认索引属性的更方便的方法。 在幕后,它将调用与每种不兼容语言相同的COM属性getter方法,如下所示。
一些编程语言(例如Visual Objects 2.6),在看到带有参数的COM属性时会惊慌失措(然后,当我使用VO时,我又会惊慌失措),因此它会退回到基本方法声明中,在本质上将其视为带有索引参数并返回字符串的方法调用:
string thing = myObject.get_Item(2) // Boo!
这些客户可能还错过了将该属性标记为DISPID_VALUE
的重要事实。
现在使用c#,可以自由地使用方法样式的操作来查询属性或按照COM的设计来使用索引属性符号。
毕竟,c#是OO。 了解属性; 了解索引器,所以您为什么不使用它们呢?
因此,为什么Resharper会提示您使用COM首选的索引样式。 这与使用常规c#类没有什么不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.