我遇到一个方法,我使用yield return
它不起作用...
public IEnumerableSomeMethod(int aParam) { foreach(DataRow row in GetClassesFromDB(aParam).Rows) { yield return new MyClass((int)row["Id"], (string)row["SomeString"]); } }
上面的代码永远不会运行,当调用此方法时,它只是跨过它.
但是,如果我改为......
public IEnumerableSomeMethod(int aParam) { IList classes = new List (); foreach(DataRow row in GetClassesFromDB(aParam).Rows) { classes.Add(new MyClass((int)rows["Id"], (string)row["SomeString"]); } return classes; }
它工作得很好.
我不明白为什么第一种方法永远不会运行,你能帮助我理解这里发生的事情吗?
当调用者实际开始枚举返回的集合时,"yield"版本仅"运行".
例如,如果您只获得该集合:
var results = SomeObject.SomeMethod (5);
并且不做任何事情,SomeMethod
不会执行.
只有当你开始枚举results
集合时,它才会被击中.
foreach (MyClass c in results) { /* Now it strikes */ }