C# 在没有内存泄漏的情况下在specialCells范围内迭代?

C# 在没有内存泄漏的情况下在specialCells范围内迭代?,c#,excel-interop,C#,Excel Interop,我有这样的情况: Range formulaCells = range.SpecialCells(XlCellType.xlCellTypeFormulas); for(int i = 1; i <= formulaCells.Count; i++) { Range cell = null; try { cell = formulaCells.get_Item(i); // do some work } catch(Exception e) {thro

我有这样的情况:

Range formulaCells = range.SpecialCells(XlCellType.xlCellTypeFormulas);
for(int i = 1; i <= formulaCells.Count; i++)
{
  Range cell = null;
  try
  {
    cell = formulaCells.get_Item(i);
    // do some work
  }
  catch(Exception e) {throw e;}
  finally
  {
    If(cell != null)
    {
      Marshal.ReleaseCOMObject(cell);
      cell = null;
    }
  }
}
我想对它们进行迭代。但问题是,当我使用foreach循环执行此操作时,内存泄漏会发生,因为特定单元的range对象并没有被释放。 我试着用传统的for循环来实现,如下所示:

Range formulaCells = range.SpecialCells(XlCellType.xlCellTypeFormulas);
for(int i = 1; i <= formulaCells.Count; i++)
{
  Range cell = null;
  try
  {
    cell = formulaCells.get_Item(i);
    // do some work
  }
  catch(Exception e) {throw e;}
  finally
  {
    If(cell != null)
    {
      Marshal.ReleaseCOMObject(cell);
      cell = null;
    }
  }
}

for(int i=1;i不要将foreach用于COM集合;在内部,它会创建一个COM对象。请改用for循环


Vladimir,formulaCells包含多个区域(Range.areas),每个区域都是Excel.Range类型的矩形。因此,您需要遍历所有区域和每个区域的每个单元格。

formulaCells是一个区域,您不能直接索引它吗?formulaCells[i]另外:你在
//中做什么工作
?通常范围内的循环可以被直接赋值代替,比如
range.Color=…
。这样你就可以让excel完成工作,这通常会更快。还有,当你说内存泄漏时,你的意思是说你的
内存不足
异常吗?我需要记住一个地址在此范围内每个单元格的nd值。之后,我需要遍历该集合,并只返回特定于我的单元格的值(具有我分配给它们的特定名称模式)@Joshua Drake,不是。我的意思是每个COM对象都应该被释放,因为它可能会导致Excel进程挂起。Smolin,我知道,我在外接程序Express上读过一些关于这一点的帖子。但问题是,当我使用for循环时,我无法遍历集合,因为它会在范围内连续给我项。例如,如果我有范围A1:A8,然后我找到带有特殊单元格的公式单元格,并获得另一个带有A2、A5、A8的范围。如果我尝试此操作:formulaRange[I],我将获得单元格A2、A3和A4。因为索引是基于行索引的。