기능 결과를 통한 루핑 할 때 Foreach는 어떻게 작동합니까?
문제
다음 코드가 있다고 가정합니다.
foreach(string str in someObj.GetMyStrings())
{
// do some stuff
}
할 것이다 someObj.GetMyStrings()
루프의 모든 반복에 호출 되나요? 대신 다음을 수행하는 것이 좋습니다.
List<string> myStrings = someObj.GetMyStrings();
foreach(string str in myStrings)
{
// do some stuff
}
?
해결책
이 기능은 한 번만 호출되어 IEnumerator<T>
; 그 후, MoveNext()
방법과 Current
속성은 결과를 통해 반복하는 데 사용됩니다.
foreach (Foo f in GetFoos())
{
// Do stuff
}
다소 동일합니다.
using (IEnumerator<Foo> iterator = GetFoos().GetEnumerator())
{
while (iterator.MoveNext())
{
Foo f = iterator.Current;
// Do stuff
}
}
반복자는 마지막에 배치됩니다. 이는 반복자 블록에서 리소스를 처리하는 데 특히 중요합니다.
public IEnumerable<string> GetLines(string file)
{
using (TextReader reader = File.OpenText(file))
{
string line;
while ((line = reader.ReadLine()) != null)
{
yield return line;
}
}
}
위 코드에서 반복을 완료 할 때 파일이 닫히고 컴파일러가 구현되기를 원합니다. IDisposable
그 일을하기 위해 교활하게.
다른 팁
아니요 ..이 기능은 ienumerable을 얻기 위해 한 번 호출됩니다. 그리고 Movenext 및 Current에 반복적으로 호출됩니다.
getMyStrings ()는 ienumerable 유형의 객체를 재조정합니다. 런타임은이를 다루는 방법을 알고 있습니다. ienumerable.getenumerator ()를 호출 한 다음 해당 열거 자체에서 객체를 호출하고 current를 호출합니다.
당신이 "모두가 동일하다"고 속인 경우에 대한 질문을 반올림하기 위해; for (int x = 0; x <provideceiling (); x ++)하다 매번 함수를 호출하십시오.
제휴하지 않습니다 StackOverflow