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

mon*_*.py 4 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;
Run Code Online (Sandbox Code Playgroud)

1.方式被描述为

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

2.方式:

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

和3.方式:

[对象索引]:对象

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

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

Han*_*ant 5

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

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

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

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

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