【问题标题】:Does a method that returns a collection get called in every iteration in a foreach statement in C#?是否在 C# 的 foreach 语句的每次迭代中调用返回集合的方法?
【发布时间】:2010-10-04 01:59:33
【问题描述】:

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

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

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

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

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

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

提前致谢。

【问题讨论】:

  • 我同意这里的答案。它只被调用一次。如果在其他情况下有疑问,请尝试在 GetDataTable() 中设置一个断点,看看它被命中了多少次。

标签: c# .net loops iterator


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    foreach 循环只是

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          GetDataTable() 只被调用一次。

          【讨论】:

            猜你喜欢
            • 2011-03-18
            • 1970-01-01
            • 2014-05-29
            • 2018-10-25
            • 2012-08-17
            • 1970-01-01
            • 1970-01-01
            • 2021-05-27
            • 2013-10-16
            相关资源
            最近更新 更多