7

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

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

因此,由于我对语言框架没有完全了解,我想知道 GetDataTable() 是否在每次迭代完成时被调用,或者它是否只被调用一次并且结果数据(将是 Rows)保存在内存循环通过它。无论如何,我声明了一个新集合来保存它并从那里开始工作......

我添加了一个新变量,所以我做了:

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

但我不太确定这是否有必要。

提前致谢。

4

5 回答 5

11

别担心;它只会在内部执行一次 GetDataTable() 以从 DataRowCollection 中获取枚举器对象,然后在每次循环运行时从中获取一个新项目。

于 2009-01-28T18:57:18.263 回答
3

foreach 循环只是语法糖

var enumerator = MyMethod.GetDataTable().Rows.GetEnumerator();
while (enumerator.MoveNext())
{
    DataRow row = enumerator.Current;
    // Initial foreach content
}
于 2009-01-29T10:21:36.630 回答
2

Gustavo - 套用我的一位老 CS 教授的话:调试器是你的朋友!如果您有几分钟和一些耐心,您可以将表格的提取包装在另一个类中并在那里放置一个断点。您会发现,确实创建了一个对象,因此不会重复调用。

于 2009-01-28T19:00:47.307 回答
1

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

于 2009-01-28T18:57:08.593 回答
0

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

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

GetDataTable() 只被调用一次。

于 2009-01-28T18:57:44.830 回答