2009-08-04 6 views
2

가능한 중복은 :
Loops and Garbage Collectionforeach 루프에서 C#을 인스턴스화 하시겠습니까?

foreach (ObjectTypeA typea in ObjectTypeACollection) 
{ 
var objectTypeAProcessor= new objectTypeAProcessor(); 
objectTypeAProcessor.Process(typea); 
} 

는 I 객체의 컬렉션을 BLL에서 처리 되하고 DAL 프로세서 called.Will 상기 코드 리드이었다 상기 유사한 코드를 발견 메모리 누수로/나쁘지? 새 인스턴스는 매번 생성되지만 매번 너무 파괴됩니까? mmm ...

+0

복제본 http://stackoverflow.com/questions/175454/loops-and-garbage-collection –

답변

1

C# /. 그물은 가비지 수집되므로 생성 된 개체가 수집되어 파기됩니다. 즉각적인 결과는 아니지만 결국에는 사라집니다. 누출이 아닙니다.

물론 루프 내에서 처리하는 것보다 각 반복마다 새 개체를 만드는 것이 더 좋습니다 (Process 메서드에 모든 개체에 대해 동일한 Processor 개체를 사용하는 것을 금지하는 부작용이 없다고 가정). if 각 반복마다 새 프로세서가 필요하지 않으므로 바깥쪽으로 이동해야합니다.

+0

하지만 외부로 이동 한 다음 메모리를 절약 할 수 있다고 말했습니까? – abmv

+0

objectTypeAProcessor 클래스가 작성된 경우, 동일한 인스턴스를 사용하여 여러 객체를 처리하는 것이 가능할 수도 있습니다. 그렇게하면 메모리를 절약 할 수있을뿐만 아니라 객체를 여러 번 할당하고 수집하는 데 드는 비용도 절감됩니다. – sepp2k

1

objectTypeAProcessor이 무엇인지 모르기 때문에 누설 여부를 알 수있는 방법이 없습니다. 예를 들어, 다른 오브젝트의 이벤트에 등록하고 서브 링크를 등록하지 않거나 자체 오브젝트에 대한 참조를 다른 오브젝트에 추가하는 경우 objectTypeAProcessor에 대한 참조가 유지되어 수집되지 않습니다.

objectTypeAProcessor의 내부 구현이 허용하는 경우 (해당되지 않을 수도 있음) 루프 외부에서 한 번만 인스턴스화하는 것이 좋습니다.

관련 문제