使用yield return时未调用的方法

8 yield-return c#-2.0

我遇到一个方法,我使用yield return它不起作用...

public IEnumerable<MyClass> SomeMethod(int aParam)
{
    foreach(DataRow row in GetClassesFromDB(aParam).Rows)
    {
        yield return new MyClass((int)row["Id"], (string)row["SomeString"]);
    }    
}
Run Code Online (Sandbox Code Playgroud)

上面的代码永远不会运行,当调用此方法时,它只是跨过它.

但是,如果我改为......

public IEnumerable<MyClass> SomeMethod(int aParam)
{
    IList<MyClass> classes = new List<MyClass>();

    foreach(DataRow row in GetClassesFromDB(aParam).Rows)
    {
         classes.Add(new MyClass((int)rows["Id"], (string)row["SomeString"]);
    }

    return classes;
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好.

我不明白为什么第一种方法永远不会运行,你能帮助我理解这里发生的事情吗?

小智 8

当调用者实际开始枚举返回的集合时,"yield"版本仅"运行".

例如,如果您只获得该集合:

var results = SomeObject.SomeMethod (5);
Run Code Online (Sandbox Code Playgroud)

并且不做任何事情,SomeMethod不会执行.

只有当你开始枚举results集合时,它才会被击中.

foreach (MyClass c in results)
{
    /* Now it strikes */
}
Run Code Online (Sandbox Code Playgroud)