我想调用一个函数列表。所有函数都返回布尔值。根据布尔值,我想中断调用函数列表中每个函数的循环。
函数需要一个参数,该参数是在“使用块”中实例化的实体框架DbContext。出现警告“进入已关闭的封盖”
using (var context = new DbContext())
{
var fileDeletionProcedure = new List<Action>
{
() => _proc.deleteUsers(Id, context),
() => _proc.deleteAccounts(Id, context),
() => _proc.deleteMoney(Id, context)
}
foreach (var f in fileDeletionProcedure)
{
var exit = f.Invoke();
if (exit)
{
break;
}
}
}
我想做类似我提供的代码的操作,但是Invoke()
返回void,有人建议吗?另外,我将如何处理有关已关闭封包的警告?
谢谢。
答案 0 :(得分:1)
答案是将Action
替换为Func<bool>
或Predicate
,但是这段代码看起来很奇怪。您会收到警告,因为编译器不知道您是否打算在using
块中执行这些操作。如果之后执行此操作,则上下文将已经被处理。如果不这样做,则可以简单地忽略此警告(带有正当理由的评论)。
正确的方法很简单:
using (var context = new DbContext())
{
if (_proc.deleteUsers(Id, context)
|| _proc.deleteAccounts(Id, context)
|| _proc.deleteMoney(Id, context))
{
return;
}
}
||
将尽快退出,因此如果deleteUsers
返回true
,它将不会执行deleteAccounts
或deleteMoney
。
但这看起来仍然很奇怪,因为没有任何迹象表明deleteXXX
函数会在发生错误的情况下返回true
。您应该扭转这种逻辑,并使用&&
代替||
答案 1 :(得分:1)
这只是一个警告,提醒您可能做错了事,很明显这些操作将在上下文中执行,并且不会被处理。
如果这是 harshaper 警告,您可以在注释中将其禁用
还请注意,操作不会返回结果,您将需要使用Func<bool>
// ReSharper disable AccessToDisposedClosure
var fileDeletionProcedure = new List<Func<bool>>
{
() => Something(db)
};
// ReSharper restore AccessToDisposedClosure
foreach (var f in fileDeletionProcedure)
{
if (f.Invoke())
break;
}