lambda中字符串的范围

时间:2013-05-16 14:23:10

标签: c# lambda scope func

我有一个有趣的场景,我已经构建了一个验证检查系统,它以List<Tuple<Func<bool>, string>>形式维护一系列需求,如果验证失败,Func应该返回true,否则返回false。该字符串是相应的拒绝描述,描述了测试失败时的条件。

在如下的更简单的测试中,验证系统非常简单:

validationChecks.Add(Tuple.Create<Func<bool>, string>(() => 
    value1 == requiredValue, "value 1 did not have the required value"));

我正在努力在更高级的情况下理解lambda中lambda中变量的范围,在这种情况下,拒绝字符串是在调用系统的另一部分时计算的。场景看起来像这样:

string rejectionString = null;
validationChecks.Add(Tuple.Create<Func<bool>, string>(() => {
    rejectionString = CallToAnotherMethodThatReturnsString(parameter);
    if (rejectionString != null) {
        return true;
    } else {
        return false;
    }
}, rejectionString));

编辑:通过测试观察,当此检查失败时,来自元组的rejectionString仍为空。我想要使​​用CallToAnotherMethod生成的rejectionString代替,有什么方法可以使用ref或其他方法来做到这一点?我需要Func的代码才能影响元组Item2中字符串的值。

问题是CallToAnotherMethodThatReturnsString内的代码可能是我只想执行ONCE的代码。但是如果检查失败,我想使用从它返回的字符串作为元组中的拒绝描述。我现在无法告诉我在第二个例子中使用rejectionString的效果是什么?在元组中的rejectionString总是为空吗?或者如果CallToAnotherMethodThatReturnsString返回不同的值,它会更新吗?

1 个答案:

答案 0 :(得分:1)

只是一个可能有效的想法。我想如果你将你的第二个Tuple参数更改为返回字符串而不是字符串值的Func,你可以接近你需要的。

string rejectionString = null;
validationChecks.Add(Tuple.Create<Func<bool>, Func<string>>(() =>
{
     rejectionString = CallToAnotherMethodThatReturnsString(parameter);
     if (rejectionString != null) {
      return true;
     } else {return false;}
 }, 
 ()=>rejectionString));

在第一种情况下,您的验证检查将设置为

validationChecks.Add(Tuple.Create<Func<bool>, Func<string>>(() => value1 == requiredValue, ()=>"value 1 did not have the required value"));

然后你的验证是逻辑

if(validationChecks[0].Item1()==false)
 var error = validationChecks[0].Item2();