然而,Resharper 对它嗤之以鼻并要求:“使用索引属性”
有点介绍 - COM 可以追溯到很久以前。您必须记住,COM 是一种二进制协议,并且一些支持 COM 的语言没有属性的概念。
COM 索引属性通常定义如下:
[propget, id(DISPID_VALUE), helpstring("blah")]
HRESULT Item([in] long Index, [out, retval] BSTR* Item);
调度 IDDISPID_VALUE
通知客户端这是通常用于索引属性的默认属性。请注意它是如何定义为属性 get但有趣的是它需要一个参数index
。正如我们将看到的,接受参数的属性 getter 的概念可能会使某些编程语言感到困惑。
完全兼容 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#是面向对象的;了解属性;了解索引器,那么您为什么不使用它们呢?
因此,为什么 Resharper 会提示您使用 COM 首选的索引样式。这与使用常规 c# 类的方式没有什么不同。