Excel Interop与,get_Item()和Item 之间的区别

这三种方式有什么区别:

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

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

2.方式:

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

和3.方式:

[对象索引]:对象

(对于这种方式,ReSharperbuild议使用2.方式。)

所以,三种方法都是一样的,但是推荐哪一种,有什么区别? 我认为所有的COMObject集合都有这三种可能性。

没有区别,select你喜欢的任何东西。 大多数程序员可能会使用// 1. Way但如果Resharper抱怨它,随时可以放弃它的要求。 Resharper可能是对象,因为它将Sheets视为.NET类而不是COM接口。 这可以被原谅,微软对此有点失望。

我会解释你为什么给出select。 C#语言总是有一个非常严格的属性定义。 C#devise人员不喜欢的是除了“唯一”(One and Only),类的索引器 (this [])之外的参数的属性。 但是这些属性在COM中很常见,特别是在Office interop中。

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

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

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