繁体   English   中英

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却不屑一顾并要求:“使用索引属性”如果您同意它的愿望(并且我喜欢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的客户端语言

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

string thing = myObject.Item[2];

这些语言看到,这个特殊的属性是一个propget但是它需要和in参数。 它被标记为DISPID_VALUE的事实DISPID_VALUE因为它告诉COM客户端它是默认属性。 将两个和两个放在一起,客户将意识到它必须是一个花哨的索引属性,以便他们可以使用普通的方括号。

重要的是要意识到这只是糖语法 这只是调用默认索引属性的更方便的方法。 在幕后,它将调用与每种不兼容语言相同的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#类没有什么不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM