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
'Programing' 카테고리의 다른 글
시간대 정보로 MySQL에 datetime을 저장하는 방법 (0) | 2020.12.13 |
---|---|
URL에 악센트 부호가있는 문자를 사용해야합니까? (0) | 2020.12.13 |
DateTime.Now가 메서드가 아닌 속성 인 이유는 무엇입니까? (0) | 2020.12.13 |
무엇을 (0) | 2020.12.13 |
잠금 내부 잠금 (0) | 2020.12.13 |