我想调用功能列表。所有函数都返回布尔值。根据布尔值,我想中断调用函数列表中每个函数的循环。
这些功能需要一个参数,该参数是在“使用块”中实例化的实体框架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,有人提出建议吗?另外,我将如何处理有关已关闭封包的警告?
非常感谢
答案是将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
。您应该反转此逻辑,并使用&&
而不是||
这只是一个警告,警告您可能做错了事,显然这些操作将在上下文中执行,并且不会被处置。
如果这是resharper警告,则可以添加注释以将其禁用
还请注意,操作不会返回结果,您需要使用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;
}