2009-08-04 6 views
2

Mögliche Duplizieren:
Loops and Garbage CollectionC# in foreach loop instanziieren?

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

fand ich den oben ähnlichen Code, wo eine Sammlung von Objekten an der BLL und der DAL-Prozessor wurde verarbeitet wurde called.Will der obige Code führen zu einem Speicherleck/ist es schlecht? Nun, jedes Mal wird eine neue Instanz erstellt, aber wird sie jedes Mal zerstört? mmm ...

+0

Duplikat von http://StackOverflow.com/Questions/175454/Loops-and-Garbage-Collection –

Antwort

1

C#/.net ist Müll gesammelt, also ja, die erstellten Objekte werden gesammelt und zerstört - nicht unbedingt sofort, aber irgendwann. Es ist also kein Leck.

Natürlich ist das Erstellen eines neuen Objekts in jeder Iteration teurer als innerhalb der Schleife (vorausgesetzt, die Process-Methode hat keine Nebenwirkungen, die Ihnen verbieten würden, dasselbe Processor-Objekt für alle Objekte zu verwenden) Sie brauchen keinen neuen Prozessor für jede Iteration, Sie sollten ihn nach außen verschieben.

+0

Aber ich könnte wie du gesagt, bewegen Sie es draußen und dann kann ich Speicher sparen? – abmv

+0

Sie können, wenn die Klasse objectTypeAProcessor in einer Weise geschrieben wird, die die gleiche Instanz verwendet, um mehrere Objekte zu verarbeiten, funktioniert, die es möglicherweise nicht ist. Das würde nicht nur Speicher sparen, sondern auch die Kosten für die Zuteilung und das Sammeln des Objekts so oft. – sepp2k

1

Es gibt keine Möglichkeit zu sagen, ob es ein Leck geben wird, weil wir nicht wissen, was objectTypeAProcessor tut. Wenn es zum Beispiel ein Ereignis eines anderen Objekts abonniert und sich nicht abnützt oder eine Referenz auf sich selbst zu einem anderen Objekt hinzufügt, wird eine Referenz auf dem objectTypeAProcessor gespeichert, so dass es nicht gesammelt wird.

Wenn die interne Implementierung von objectTypeAProcessor dies zulässt (was möglicherweise nicht der Fall ist), wäre es besser, sie nur einmal außerhalb der Schleife zu instanziieren.