2010-01-13 20 views
7

Tengo una lista de arrays muy poblada, que quiero borrar y reutilizar. Si lo borro, ¿liberará la memoria usada anteriormente?.net ¿ArrayList.Clear libera memoria?

También debo mencionar que el arraylist es un campo privado de solo lectura de una clase que todavía tiene mucho trabajo activo que hacer después de usar el arraylist la primera vez. Así que no puedo esperar a la recolección de basura después de que la clase sale del alcance.

¿El método Clear es lo suficientemente rápido? ¿O debería destruir y crear un nuevo arraylist?

actualización

Pregunta:

Si tengo ámbito declarado como esto (gracias a los consejos de Jon)

/// <summary> 
    /// Collection of tasks. 
    /// </summary> 
    private List<Task> tasks = new List<Task>(); 

entonces pueblan .... (en gran medida)

Ahora bien, si en lugar de despejándolo y recortándolo, ¿puedo simplemente llamar a:

tasks = new List<Task>(); 

¿Esto sería recomendable?

+0

+1 para Jon, ya que está cubierto realmente. Sin embargo, Clear no liberará realmente la memoria de todos modos, solo el Garbage Collector lo hace. Los objetos IDisposibles correctamente escritos también liberan memoria no administrada en su implementación de Dispose - si corresponde. Tal vez solo estoy siendo pedante aunque :) –

+0

Buen punto Andras, pero creo que es suficiente tener esa memoria lista para la recolección de basura. –

Respuesta

16

Haga lo que exprese mejor su intención. ¿Usted realmente quiere una nueva lista? Si es así, crea uno nuevo. Si conceptualmente desea reutilizar la misma lista, llame al Clear.

La documentación para ArrayList sí declara que Clear retiene la capacidad original - por lo que todavía tiene una gran variedad, pero será llena de ceros en lugar de referencia a los elementos anteriores:

Capacity permanece sin cambios. Para restablecer la capacidad de ArrayList, llame al TrimToSize o configure la propiedad Capacity directamente. Recortar un vacío ArrayList establece la capacidad del ArrayList en la capacidad predeterminada.

¿Alguna razón por la que está usando ArrayList en lugar de List<T> por cierto?

+0

Hola Jon, para responder a tu pregunta falta de conocimiento, supongo, ¿cuál es el beneficio de utilizar la Lista ? –

+1

@JL: Las colecciones genéricas son generalmente mejores: escriba seguro en tiempo de compilación, más fácil de usar (sin necesidad de moldes), más eficiente para los tipos de valor ... ¿qué versión de .NET está usando? (Solo están disponibles desde .NET 2.0 y versiones posteriores.) –

+0

Última q: si tuviera una lista densamente poblada y después de usarla establezca su valor en la nueva lista (obviamente donde T = mi clase) - esto me daría una nueva lista y al mismo tiempo liberaría la utilizada anteriormente memoria para la recolección de basura? –

3

Si desea que la memoria se libere realmente, configúrela como nula e invoca el recolector de elementos no utilizados. Luego crea una nueva ArrayList. Si lo configura en nulo y luego crea uno nuevo, eventualmente obtendrá basura recolectada cuando se requiera memoria adicional. Además, estoy en segundo lugar colecciones genéricas. Ha pasado mucho tiempo desde que utilicé ArrayList.

+1

Estoy de acuerdo en GC.Free(), lo evito. Sin embargo, he visto instancias donde es necesario. He leído técnicas para usarlo en juegos XNA entre escenas para evitar la recolección de basura en el momento incorrecto de un juego ... tiene sus aplicaciones. – Nate

Cuestiones relacionadas