调用功能列表。如何获得它们的返回值并使用可能是已处置闭包的一部分的参数?

问题描述 投票:0回答:2

我想调用功能列表。所有函数都返回布尔值。根据布尔值,我想中断调用函数列表中每个函数的循环。

这些功能需要一个参数,该参数是在“使用块”中实例化的实体框架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,有人提出建议吗?另外,我将如何处理有关已关闭封包的警告?

非常感谢

c#
2个回答
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,它将不执行deleteAccountsdeleteMoney

但是,这看起来仍然很奇怪,因为没有任何迹象表明在发生错误的情况下,deleteXXX函数将返回true。您应该反转此逻辑,并使用&&而不是||


1
投票

这只是一个警告,警告您可能做错了事,显然这些操作将在上下文中执行,并且不会被处置。

如果这是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;
}
© www.soinside.com 2019 - 2024. All rights reserved.