아니요, List<T>.Exists
메서드가 열심히 실행되기 때문에 문제가 없습니다. 결과적으로, 캡처 된 변수의 값 변경은 즉시 "응답 됨"입니다. do에는 수정 된 클로저가 있지만 반드시 (이 경우처럼) 잘못 될 필요는 없습니다.
반면에 "lambda"(실제로 대리자)를 루프 내부 목록에 추가 한 다음 나중에이 쿼리를 실행하면 Resharper의 실제 수정 된 클로저 문제가 발생합니다 당신에 대해 경고하고 있습니다. 희망이 경고를 제거하는 경우
, 당신은 할 수 :
string reference;
do {
reference = GenerateNewReference();
var refCopy = reference;
} while (currentItems.Exists(i => i.Reference.Equals(refCopy));
약간 오프 주제 : 당신은 수정 된 폐쇄 경고없이 (검색을 작성하는 방법의 멋진을 원하는 경우), 당신은 같은 유틸리티 메소드를 작성할 수
public static IEnumerable<T> Generate(Func<T> func)
{
if(func == null)
throw new ArgumentNullException("func");
while(true)
yield return func();
}
그리고로 사용 :
var result = MyExtensions.Generate(GenerateNewReference)
.First(reference => !currentItems.Exists(i => i.Reference.Equals(reference)));
출처
2011-01-22 13:27:57
Ani