簡體   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