以下是遍历一次性对象的安全方法吗?或者这会导致对象不适? ETC?如果我使用 dispose 语句而不是 using 嵌套会怎样?
public static void Main()
{
foreach (ChildObject oChild in webApp)
{
//On Noes! Unexpected Error!
}
}
public static IEnumerable<ChildObject> SafelyGetNextObjInWebApp(WebApplication webApp)
{
foreach (ParentObject oParent in webApp.Parents)
{
using (parent)
{
foreach (ChildObject oChild in oParent.Children)
{
using (oChild)
{
yield return oChild;
}
}
}
}
}
除非您的调用者枚举 所有 SafelyGetNextObjInWebApp()
返回的对象,否则您的方法是不安全的。考虑以下语句中发生的情况:
ChildObject o = SafelyGetNextObjInWebApp(arg).First();
在这种情况下,SafelyGetNextObjInWebApp()
的执行将在 yield
语句处停止,并且永远不会继续。因此,该对象不会被此调用处理掉。
如果您想使用迭代器一次返回一个网络服务创建的对象,您应该确保调用是异常安全的,并强制迭代器调用的调用者处置。举例说明:
public IEnumerable<ParentObject> GetParents(WebApplication webApp)
{
// assumes webApp.Parents uses deferred execution.
return webApp.Parents;
}
public void ProcessParent(WebApplication webApp)
{
foreach (ParentObject p in GetParents())
{
// Assumes p.Dipsose() calls ChildObject.Dispose() for all p.ChildObjects.
using(p)
{
foreach (ChildObject o in p.ChildObjects)
{
// do something with o
}
}
}
}
我是一名优秀的程序员,十分优秀!