이 블로그 게시물 에서 For -if 안티 패턴에 대해 읽고 있었는데 왜 안티 패턴인지 이해하지 못했습니다.
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를 가장 적절하게 사용하는 것이 아니라고 생각하지만 여기서는 괜찮습니다. 이것은 귀하의 질문에 대한 답변이 아니지만, 그중 일부에 혼란을줍니다.