C# 调用函数列表。如何获取它们的返回值并使用可能是已处理闭包的一部分的参数?
我想调用一个函数列表。所有函数都返回bool。根据bool,我想中断调用函数列表中每个函数的循环 这些函数需要一个参数,该参数是实体框架DbContext,在“使用块”中实例化。有一个警告“访问已处理的关闭”C# 调用函数列表。如何获取它们的返回值并使用可能是已处理闭包的一部分的参数?,c#,C#,我想调用一个函数列表。所有函数都返回bool。根据bool,我想中断调用函数列表中每个函数的循环 这些函数需要一个参数,该参数是实体框架DbContext,在“使用块”中实例化。有一个警告“访问已处理的关闭” 使用(var context=new DbContext()) { var fileDeletionProcedure=新列表 { ()=>_proc.deleteUsers(Id、上下文), ()=>_过程删除帐户(Id、上下文), ()=>_proc.deleteMoney(Id,co
使用(var context=new DbContext())
{
var fileDeletionProcedure=新列表
{
()=>_proc.deleteUsers(Id、上下文),
()=>_过程删除帐户(Id、上下文),
()=>_proc.deleteMoney(Id,context)
}
foreach(fileDeletionProcedure中的变量f)
{
var exit=f.Invoke();
如果(退出)
{
打破
}
}
}
我想做一些类似于我提供的代码的事情,但是Invoke()
返回void,有人有建议吗?另外,我将如何处理关于已处置关闭的警告
提前感谢。答案是将
操作
替换为Func
或谓词
,但此代码看起来很奇怪。您会收到一条警告,因为编译器不知道您是否要在使用块时执行这些操作。如果在之后执行此操作,则上下文将已被释放。如果你不这样做-你可以忽略这个警告(放一个有理由的评论)
正确的方法很简单:
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
。你应该颠倒这个逻辑,使用&&
而不是|
答案是用Func
或谓词
替换操作
,但是这个代码看起来很奇怪。您会收到一条警告,因为编译器不知道您是否要在使用块时执行这些操作。如果在之后执行此操作,则上下文将已被释放。如果你不这样做-你可以忽略这个警告(放一个有理由的评论)
正确的方法很简单:
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
。您应该反转此逻辑,使用&&
而不是| |
这只是一个警告,提醒您可能做了错误的事情,显然操作将在上下文中执行,不会被处理
如果这是一个重竖琴警告,您可以通过注释禁用它
还要注意,操作不会返回结果,您需要使用Func
//ReSharper禁用访问disposedclosure
var fileDeletionProcedure=新列表
{
()=>某物(db)
};
//ReSharper还原访问DisposedClosure
foreach(fileDeletionProcedure中的变量f)
{
if(f.Invoke())
打破
}
这只是一个警告,提醒您可能做了错误的事情,显然操作将在上下文中执行,并且不会被处理
如果这是一个重竖琴警告,您可以通过注释禁用它
还要注意,操作不会返回结果,您需要使用Func
//ReSharper禁用访问disposedclosure
var fileDeletionProcedure=新列表
{
()=>某物(db)
};
//ReSharper还原访问DisposedClosure
foreach(fileDeletionProcedure中的变量f)
{
if(f.Invoke())
打破
}
// ReSharper disable AccessToDisposedClosure
var fileDeletionProcedure = new List<Func<bool>>
{
() => Something(db)
};
// ReSharper restore AccessToDisposedClosure
foreach (var f in fileDeletionProcedure)
{
if (f.Invoke())
break;
}