我有一个方法,它包含一系列对方法的调用,该方法检查字符串输入是空还是空。如果为空,则将第二个参数设置为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。
有更好的方法吗?
答案 0 :(得分:2)
bool
是value type,这意味着该值将传递给方法而不是参考。
您有两种选择,您可以从方法bool
返回StringContainsData
结果,如下所示:
public bool StringContainsData(string input, bool result)
{
return string.IsNullOrEmpty(input);
}
或者您可以使用可能不是您想要的ref
/ out
。
答案 1 :(得分:1)
最简单的是重组链接来电。
如果只是简单地将上一个答案与新答案联系起来,那就没有必要了。
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));
}
注意:
最后一个版本看起来很复杂,但是如果要添加更多文件路径来检查扩展数组比分配/调用行上的cut / past更简单/更安全。
在此功能中,首先使用短路(&&)检查 ret 表示如果我们已经失败,我们无需检查当前输入。