2015-07-11 162 views
4

What's那些3種方式之間的區別:Excel的互操作差[]

Application xlApp = new Application(); 
Workbooks xlWorkbooks = xlApp.Workbooks; 
Workbook xlWorkbook = xlWorkbooks.Open(filePath); 
Sheets xlSheets = xlWorkbooks.Sheets; 

// 1. Way 
Worksheet xlSheet = xlSheets["SheetName"] as Worksheet; 

// 2. Way 
Worksheet xlSheet = xlSheets.Item["SheetName"] as Worksheet; 

// 3. Way 
Worksheet xlSheet = xlSheets.get_Item("SheetName") as Worksheet; 

的1路被描述爲

索引對象微軟.Office.Interop.Excel.Sheets.this
保留供內部使用。

的2路:

索引屬性對象Microsoft.Office.Interop.Excel.Sheets.Item
從集合返回一個對象。

而3路:

[對象索引]:對象

所以(對於這種方式,ReSharper的建議使用2路。) ,所有3種方式完全相同,但推薦哪一種,有什麼區別? 我認爲所有COMObject集合都有這3種可能性。

回答

5

沒有區別,選擇你喜歡的任何東西。大多數程序員可能會使用// 1. Way,但如果Resharper對此抱怨,那麼可以隨意屈服於它的要求。 Resharper可能是對象,因爲它將Sheets視爲.NET類而不是COM接口。這可以被原諒,微軟稍微摸索了一下。

我會解釋你爲什麼給出選擇。 C#語言總是有一個非常嚴格的屬性定義。 C#設計人員不喜歡的是除了一個和一個類(the indexer)(這個[])之外的參數的屬性。但是,這些屬性在COM中很常見,特別是在Office interop中。

COM也有一個索引器的概念,粗略地說,類的默認屬性是特殊的。這是擁有[DispId(0)]的財產。就像C#索引器一樣,它不必在表達式中命名。

具有Sheets.Item屬性的怪癖是它有錯誤的[DispId]。出於某種原因,它是170而不是0.默認屬性是Sheets._Default。您將在// 1. Way中使用哪個屬性。不知道這是怎麼發生的,像19年前的疏忽一樣,他們無法再糾正。

C#團隊在版本4中提供了參數,並允許在COM接口上使用索引屬性。這就是爲什麼你有選擇,需要在早期版本中使用get_Item()方法,現在也支持Item屬性。在運行時完全沒有區別。