English 中文(简体)
在C#的foreach语句中,返回集合的方法会在每次迭代中被调用吗?
原标题:
  • 时间:2009-01-28 18:55:08
  •  标签:

今天早上我在处理一些C#代码,我有这样的东西:

foreach(DataRow row in MyMethod.GetDataTable().Rows) {
//do something
}

因此,由于我没有对语言框架有完全理解,我想知道GetDataTable()是否每次执行迭代时都会被调用,还是仅被调用一次,并将生成的数据(即行)保存在内存中以循环通过。在任何情况下,我声明了一个新集合来保存它并从那里工作...

我新增了一个变量,所以我执行了:

DataRowCollection rowCollection = MyMethod.GetDataTable().Rows;
foreach(DataRow row in rowCollection) {
//do something
}

但我不是很确定这是否必要。

提前致谢。

最佳回答

不用担心;它将内部只执行一次GetDataTable()以从DataRowCollection获取枚举器对象,然后每次循环通过它获取一个新项。

问题回答

一个foreach循环只是语法糖。

var enumerator = MyMethod.GetDataTable().Rows.GetEnumerator();
while (enumerator.MoveNext())
{
    DataRow row = enumerator.Current;
    // Initial foreach content
}

Gustavo - 为了引用我的一位老CS教授的话:调试器是你的好伙伴!如果你有几分钟和一些耐心,你可以在另一个类中封装表的提取并在那里放置断点。你会发现确实创建了一个对象,以便调用不会重复。

它只被调用一次,然后被存储。

你所做的基本上是同一件事情。在第一种情况下,你正在创建对DataRowCollection类的引用,然后运行foreach,在第一种情况下,你没有创建引用。在两种情况下,都在堆上调用DataRowCollection实例的.GetEnumerator()。

在从方法GetDataTable()检索到实例后,您将在实例上调用它。

GetDataTable()只会被调用一次。





相关问题
热门标签