gpt4 book ai didi

c# - 遍历一次性对象

转载 作者:太空宇宙 更新时间:2023-11-03 17:55:30 25 4
gpt4 key购买 nike

以下是遍历一次性对象的安全方法吗?或者这会导致对象不适? 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
}
}
}
}

关于c# - 遍历一次性对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12077951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com