我在此博客上阅读了有关“如果-如果反模式”的信息,但我不确定我是否理解为什么它是反模式。
foreach (string filename in Directory.GetFiles("."))
{
if (filename.Equals("desktop.ini", StringComparison.OrdinalIgnoreCase))
{
return new StreamReader(filename);
}
}
问题1:
是因为return new StreamReader(filename);
里面for loop
吗?还是for
在这种情况下不需要循环的事实?
正如博客作者所指出的那样,这种方式的疯狂程度较小:
if (File.Exists("desktop.ini"))
{
return new StreamReader("desktop.ini");
}
两者都处于竞争状态,因为如果在创建之前删除文件StreamReader
,您将得到一个FileNotFoundException
。
问题2:
要修复第二个示例,您是否要在不使用if语句的情况下重新编写它,而是StreamReader
使用try-catch块将其包围,并且如果引发了FileNotFoundException
您在该catch
块中进行相应的处理?
To fix the second example, would you re-write it without the if statement, and instead surround the StreamReader with a try-catch block, and if it throws a FileNotFoundException you handle it in the catch block accordingly?
-是的,这正是我要做的。解决竞争条件比“作为控制流的例外”的某些概念更为重要,并且它可以优雅,干净地解决。
null
吗?通常,您可以使用LINQ来清理类似于示例代码的代码:return Directory.GetFiles(".").FirstOrDefault(fileName => fileName.Equals("desktop.ini", StringComparison.OrdinalIgnoreCase))?.Select(fileName => new StreamReader(filename));
注意?.
两个LINQ调用之间的运算符。人们可能还会争辩说,这样的对象创建不是LINQ的最合适的用法,但我认为在这里还可以。这不是您的问题的答案,但确实离题了。