[英]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.