0

我有一个方法,其中包含对检查字符串输入是否为空或为空的方法的一系列调用。如果为空,则将第二个参数设置为 false;

public bool inputsContainData()
{
    bool validInputs = True;

    _helper.StringContainsData(_view.FilePath1, validInputs);
    _helper.StringContainsData(_view.FilePath2, validInputs);

    //...

    Return validInputs;
}

StringContainsData() 方法在一个类中,该类被 DI 注入到演示者中。该方法不返回任何内容,因为结果变量是引用类型。

public void StringContainsData(string input, bool result)
{
    if( string.IsNullOrEmpty(input))
    {
        result = false;
    }
}

我对此有一些问题,因为我无法模拟 StringContainsData() 并让它返回特定的结果。我能想到的唯一解决方案是,如果我包含第二个 If 语句,如下所示:

    public bool StringContainsData(string input, bool result)
    {
        if( string.IsNullOrEmpty(input))
        {
            if(result != false)
            {
                return false;
            }
        }
        else
        {
            if(result == false)
            {
                return false;
            }
        }
        return true;
    }

从而阻止我拥有 True,False,True => final result = true 而不是 false。

有没有更好的方法来做到这一点?

4

2 回答 2

2

bool是一个值类型,这意味着该值将被传递给方法而不是引用。

您有两个选择,您可以bool从这样的方法返回结果StringContainsData

public bool StringContainsData(string input, bool result)
{
    return string.IsNullOrEmpty(input);
}

或者你可以使用ref/out这可能不是你想要的。

于 2012-09-03T14:19:44.893 回答
1

最简单的是重组以链接调用。

如果只需将先前的答案与新答案进行 AND 运算,则不需要另一个答案。

public bool StringContainsData(string aString, bool answerToDate) {
    return answerToDate && !string.IsNullOrWhiteSpace(aString);
}

public bool inputsContainData() {        
    bool validInputs = True;        

    validInputs = _helper.StringContainsData(_view.FilePath1, validInputs);        
    validInputs = _helper.StringContainsData(_view.FilePath2, validInputs);        

    return validInputs;        
}        

或者如果你想找点乐子

public bool inputsContainData() {        
    var inputs = new []{ _view.FilePath1, _view.FilePath2};
    return inputs.Aggregate(true, (ret, inp) => ret && !string.IsNullOrWhiteSpace(inp));        
}  

笔记:

最后一个版本本身看起来很复杂,但是如果您要添加更多文件路径来检查扩展数组比分配/调用行上的剪切/过去更简单/更安全。

在函数中,首先使用短路(&&)检查ret意味着如果我们已经失败,我们不需要检查当前输入。

于 2012-09-03T14:55:19.927 回答