2015-07-11 94 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属性。在运行时完全没有区别。