C# Resharper与Excel互操作中常用的getRange()有什么不同?

C# Resharper与Excel互操作中常用的getRange()有什么不同?,c#,excel-interop,named-ranges,indexed-properties,resharper-9.2,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更好?前者如何比后者

几乎所有C#Excel interop的在线示例代码都包含以下内容:

monthlyChartRange = _xlSheetChart.get_Range("A3", "C4");
然而,Resharper对它嗤之以鼻,并要求:“使用索引属性”,如果你同意它的意愿(我爱R#,所以我总是说,“如你所愿”),它会将其更改为:

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

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

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

Excel automation的COM端口刚刚暴露了Getter,尽管这并不是真正的OO风格

顺便说一句,我建议用办公自动化代替。它的速度快了10万亿倍

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

有一点介绍可以追溯到很久以前。您必须牢记COM是一个二进制协议,一些COM感知语言没有属性概念

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

[propget, id(DISPID_VALUE), helpstring("blah")]
HRESULT Item([in] long Index, [out, retval] BSTR* Item);
分派ID是
DISPID\u值
,它通知客户端这是通常用于索引属性的默认属性。注意它是如何定义为属性get的,但有趣的是,它需要一个参数
index
。我们将看到,接受参数的属性getter的概念可能会让某些编程语言感到困惑

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

string thing = myObject.Item[2];
这些语言可以看到这个特定属性是一个
propget
,但是它需要
参数。它被标记为
DISPID\u VALUE
这一事实相当吸引人,因为这告诉COM客户端它是默认属性。把二和二放在一起,客户机会意识到它必须是一个漂亮的索引属性,这样他们才能使用groovy方括号

重要的是要意识到这只是一种糖类语法。这只是调用默认索引属性更方便的方法。在幕后,它将根据不兼容的语言调用相同的COM属性getter方法,如下所示

不太兼容COM的客户端语言 一些编程语言(如Visual Objects 2.6)在看到接受参数的COM属性时会发疯(然后我在使用VO时也会发疯),因此它会返回到基础方法声明,在该声明中,它本质上将其视为接受索引参数并返回字符串的方法调用:

string thing = myObject.get_Item(2)  //  Boo!
这些客户端可能还忽略了一个重要事实,即属性被标记为
DISPID\u VALUE

现在有了c#,您可以自由地使用方法风格的操作来查询属性,或者按照COM的设计和使用索引属性表示法进行操作

毕竟,c#是OO;了解财产;理解索引器,为什么不使用它们呢


因此,Resharper会提示您使用COM首选的索引样式。这与你如何使用一个普通的c#类没有什么不同。

我喜欢周五下午夸张的样子(你一天的时间可能会有所不同)。一个适用于特定编程语言的特定实现的术语“属性”如何“更像OO”而不是一个完成相同任务的函数(即封装)?我认为你已经被洗脑,对什么是面向对象编程有了错误的认识。C++没有属性,你会说它比C语言纯粹的OO要少吗?@ EdS.,我没有这么说,这只是RESHARPER做过的动机。这是C语言,不是C++,所以是目标语言。谢谢你的编辑。否决票被删除。周末愉快:)看。正如答案中所提到的,这根本不是关于OO,而是关于更简洁的语法。