如果条件在多个语句中如何应用,作为最佳实践?

时间:2017-12-07 10:18:55

标签: c#

我需要在多个语句中应用If条件,如下所示。

两个问题:

  1. 完成任务的最佳做法是什么?
  2. 从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;
    

1 个答案:

答案 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;
}

关于代码样式的附注:即使块只包含一行,也应始终将ifforeach块放入括号{ }中。这可以预防dangling else等问题。