我需要在多个语句中应用If条件,如下所示。
两个问题:
从foreach循环中返回控件,如下所示:这样做是否安全?
if (assettFileParser.AddFile(_cfgFile, MyFileType.CFG) == ParserReturnCode.FileNotFound) return false;
if (_psFiles != null)
foreach (var file in _psFiles)
if(assettFileParser.AddFile(file, MyFileType.PS)== ParserReturnCode.FileNotFound) return false;
if (_picFiles != null)
foreach (var file in _picFiles)
if (assettFileParser.AddFile(file, MyFileType.ParaIC) == ParserReturnCode.FileNotFound) return false;
if (_icFiles != null)
foreach (var file in _icFiles)
if (assettFileParser.AddFile(file, MyFileType.IC) == ParserReturnCode.FileNotFound) return false;
if (_xMasterFiles != null)
foreach (var file in _xMasterFiles)
if (assettFileParser.AddFile(file, MyFileType.XMaster) == ParserReturnCode.FileNotFound) return false;
答案 0 :(得分:1)
这里我结合了Dylan Nicholson和Poylfun的建议:使用一个抛出异常的辅助方法(你可以通过继承System.Exception
来引入你自己的异常类型)。我还将foreach
移到了辅助方法中,它接受了一组文件。帮助程序还确保文件集合不为null,因此调用者不必检查它。
public void AddAssetFiles(AssettFileParser assettFileParser,
IEnumerable<string> files, MyFileType fileType) {
if (files == null) {
return; // do nothing
}
// note that looping over an empty collection will do nothing
foreach (var file in files) {
var returnCode = assettFileParser.AddFile(file, fileType);
if (returnCode == ParserReturnCode.FileNotFound) {
throw new AssetFileNotFoundException($"File '{file}' was not found.");
}
}
}
用法示例。找不到第一个文件将导致整个try
块终止。之后不再处理其他文件。
try {
// put _cfgFile into a string array so it can be passed as IEnumerable<string>
AddAssetFiles(assettFileParser, new string[] { _cfgFile }, MyFileType.CFG);
AddAssetFiles(assettFileParser, _psFiles, MyFileType.PS);
AddAssetFiles(assettFileParser, _picFiles, MyFileType.ParaIC);
// ...
return true;
}
catch (AssetFileNotFoundException ex) {
Logger.Error(ex);
return false;
}
关于代码样式的附注:即使块只包含一行,也应始终将if
和foreach
块放入括号{ }
中。这可以预防dangling else等问题。