【问题标题】:Excel Interop difference between [], get_Item() and Item[][]、get_Item() 和 Item[] 之间的 Excel 互操作差异
【发布时间】:2015-07-11 18:03:40
【问题描述】:

这三种方式有什么区别:

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. 方式:

[对象索引]:对象

(对于这种方式,ReSharper推荐使用2.方式。)

那么,所有 3 种方法都完全相同,但是推荐哪一种,有什么区别? 我认为所有的 COMObject Collections 都有这 3 种可能性。

【问题讨论】:

    标签: c# excel interop


    【解决方案1】:

    没区别,随便挑。大多数程序员可能会使用// 1. Way,但如果 R​​esharper 抱怨它,那么请随意屈服于它的要求。 Resharper 可能会反对,因为它将表格视为 .NET 类而不是 COM 接口。可以原谅的是,微软对此有点摸不着头脑。

    我会解释为什么给你选择。 C# 语言总是对属性有非常严格的定义。 C# 设计者不喜欢带参数的属性,而不是类的唯一且唯一的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 属性。运行时完全没有区别。

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 2013-01-28
      • 2023-03-02
      • 2010-10-24
      • 2016-10-26
      相关资源
      最近更新 更多