Excel,[],get_Item()和Item []之间的Interop差异

时间:2015-07-11 18:03:41

标签: c# excel interop

这3种方式之间的区别是什么:

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.方式被描述为

  

Indexer对象Microsoft.Office.Interop.Excel.Sheets.this
  保留供内部使用。

2.方式:

  

索引属性对象Microsoft.Office.Interop.Excel.Sheets.Item   
从集合中返回单个对象。

而且3.方式:

  

[object Index]:object

(为此,ReSharper建议使用2.方式。)

所以,所有3种方式完全相同,但建议使用哪种方式,区别是什么? 我认为所有COMObject Collections都有这三种可能性。

1 个答案:

答案 0 :(得分:5)

没有区别,选择你喜欢的任何东西。大多数程序员可能会使用// 1. Way,但如果Resharper抱怨它,那么可以随意屈服于它的需求。 Resharper可能是对象,因为它将Sheets视为.NET类而不是COM接口。这可以原谅,微软有点笨拙。

我将解释为什么给你这个选择。 C#语言总是有一个非常严格的属性定义。 C#设计者不喜欢的是带有参数的属性,除了One和Only之外,the indexer类(this [])。然而,这些属性在COM中很常见,尤其是在Office互操作中。

COM也有一个索引器的概念,粗略地说,类的默认属性是特殊的。它是具有[DispId(0)]的属性。就像C#索引器一样,它不必在表达式中命名。

Sheets.Item属性的怪癖是它有错误的[DispId]。由于某种原因,它是170而不是0.默认属性是Sheets._Default。您将在// 1. Way中使用哪个属性。不知道这是怎么发生的,像19年前的疏忽那样嘎嘎叫他们再也无法纠正了。

C#团队在版本4中放弃了,并允许在COM接口上使用索引属性。这就是为什么你有一个选择,需要在早期版本中使用get_Item()方法,现在也支持Item属性。在运行时完全没有区别。