Programing

foreach는 자동으로 Dispose를 호출합니까?

crosscheck 2020. 12. 13. 08:57
반응형

foreach는 자동으로 Dispose를 호출합니까?


C #에서 foreach는 IDisposable을 구현하는 모든 개체에서 Dispose를 자동으로 호출합니까?

http://msdn.microsoft.com/en-us/library/aa664754(v=vs.71).aspx 는 다음과 같이 표시되는 것 같습니다.

* 그렇지 않으면 컬렉션식이 System.IEnumerable을 구현하는 형식이고 foreach 문의 확장은 다음과 같습니다.

IEnumerator enumerator = 
        ((System.Collections.IEnumerable)(collection)).GetEnumerator();
try {
   while (enumerator.MoveNext()) {
      ElementType element = (ElementType)enumerator.Current;
      statement;
   }
}
finally {
   IDisposable disposable = enumerator as System.IDisposable;
   if (disposable != null) disposable.Dispose();
}

예, foreach는 IDisposable을 구현하는 경우 열거 자에서 Dispose ()를 호출합니다.


이 질문 / 답변은 잘못된 표현입니다.

질문이 다음과 같은지 확실하지 않습니다.

Q : "foreach는 다음으로 이동하기 전에 열거자가 반환 한 개체를 처리합니까?"

A : 물론 아닙니다. 열거 형의 각 개체에 대해 일부 코드를 한 번 실행하는 편리한 방법을 제공하는 것 외에는 아무것도하지 않습니다.

또는 다음을 의미하는지 여부 :

Q : "내부에서 foreach는 열거 가능한 객체를 사용합니다. 반복자 블록에 예외가 있더라도 foreach에 대한 호출 후에이 객체가 삭제됩니까?"

A : 대답은 (아직도 분명히) 예입니다! 구문은 열거 자에 대한 액세스를 제공하지 않기 때문에이를 폐기 할 책임이 있습니다.

두 번째 질문에 대한 답은 foreach가 try / finally 블록으로 while 블록으로 확장된다는 것을 사람들이 들었 기 때문에 혼란이 발생하는 곳입니다. 마지막으로 IDisposable을 구현하는 경우 열거자가 삭제되도록하는 것이 목적입니다.

직접 확인해야하는 경우 : 여기에서 실제로 확인하세요.

이것이 명확히하는 데 도움이되기를 바랍니다. ;)

참고 URL : https://stackoverflow.com/questions/4982396/does-foreach-automatically-call-dispose

반응형