Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C#] Dubbio su oggetti da eliminare

    Ragazzi, mi sta sorgendo un dubbio.

    Sto costruendo un'applicazione e all'interno di questa applicazione vi sono degli ArrayList.

    Questi ArrayList contengono oggetti omogenei (gruppi di bottoni, o combo o text, etc.).

    Ovviamente questi oggetti sono anche visibili sulla form.

    Il dubbio che mi viene è questo.

    Dovendo eliminare tutti questi oggetti la procedura che faccio è:

    1° Un ciclo foreach (o for, tanto è uguale) per scorrermi tutti gli oggetti dell'arraylist, all'interno del ciclo uno alla volta, richiamando il metodo di Controls.Remove, rimuovo tutti gli oggetti di questo ArrayList dalla form.

    2° Richiamo l'Item.Clear() (ora non mi ricordo se ce l'aveva il Clear...) dell'arraylist

    In sostanza Levo gli oggetti dalla form e dall'arraylist, il dubbio che mi viene, ma questi oggetti, esistono ancora? Ovvero, occupano ancora memoria?

    Se si, se ne occupa il garbage collection o devo trovare un modo per occuparmene io?

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    20
    Allora per cancellare gli oggetti dall' ArrayList puoi utilizzare il metodo piu veloce cioè nomearraylist.Clear
    Detto tra parentesi i cicli foreach dovrebbero essere utilizzati per la sola lettura, meglio un cilco for se devi modificare un array, comunque in questo caso basta il metodo clear. Però bisogna vedere se gli oggetti sono memorizzati direttamente nell'arraylist o se vi fa solo riferimento. Non sono sicuro pienamente del mio consiglio anche perchè non ho capito bene quello che devi fare però spero di essere stato utile.

  3. #3
    Allora, io gli oggetti li creo da codice e non li metto nella form con l'editor grafico.

    Creo un oggetto e poi lo piazzo nell'arraylist ma a fine routine l'oggetto base che avevo creato sparisce e l'unico riferimento ce l'ho nell'arraylist.

    Es.

    Button bot=new Button();
    inizializzo bot, gli do dimensioni ed altro, gli affibbio un evento e poi lo metto nell'arraylist e nella form.

    Il ciclo for o foreach mi serviva infatti in lettura, devo prima leggermi tutto l'arraylist per cacnellare uno ad uno questi oggetti dalla form, poi posso svuotare l'arraylist.

  4. #4

    Re: [C#] Dubbio su oggetti da eliminare

    Originariamente inviato da Debiru
    2° Richiamo l'Item.Clear() (ora non mi ricordo se ce l'aveva il Clear...) dell'arraylist
    Questo metodo è più rapido.
    In sostanza Levo gli oggetti dalla form e dall'arraylist, il dubbio che mi viene, ma questi oggetti, esistono ancora? Ovvero, occupano ancora memoria? Se si, se ne occupa il garbage collection o devo trovare un modo per occuparmene io?
    Se hai eliminato tutti i riferimenti a questi oggetti alla successiva garbage collection gli oggetti verranno distrutti automaticamente.
    Però bisogna vedere se gli oggetti sono memorizzati direttamente nell'arraylist o se vi fa solo riferimento.
    Gli ArrayList se non sbaglio memorizzano solo riferimenti ad oggetti (visto che memorizzano degli Object, che sono dei reference-type).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    20
    Gli ArrayList se non sbaglio memorizzano solo riferimenti ad oggetti (visto che memorizzano degli Object, che sono dei reference-type).
    giusto ma qui mi sorge una domanda se il puntatore a un oggetto viene cancellato può essere che l'oggetto stesso invece non viene cancellato?(scusate se vado OT)

    Es.

    Button bot=new Button();
    inizializzo bot, gli do dimensioni ed altro, gli affibbio un evento e poi lo metto nell'arraylist e nella form.

    Il ciclo for o foreach mi serviva infatti in lettura, devo prima leggermi tutto l'arraylist per cacnellare uno ad uno questi oggetti dalla form, poi posso svuotare l'arraylist.
    Ma scusa tu l'istanza dell'array list per caso l'hai creata all'interno della routine?

  6. #6
    Originariamente inviato da Federer
    giusto ma qui mi sorge una domanda se il puntatore a un oggetto viene cancellato può essere che l'oggetto stesso invece non viene cancellato?(scusate se vado OT)
    Be', l'oggetto non viene cancellato immediatamente, ma alla prima garbage collection il garbage collector nota che nessun oggetto "vivo" ha dei riferimenti a quell'oggetto e quindi lo distrugge.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    In sostanza io gestisco degli oggetti sulla form che creo in serie dinamicamente, a volte ne elimino uno in particolare, a volte mi serve di eliminarli tutti.

    Ora non sto a spiegare perché ho fatto così ma mi è servito per delle funzionalità dell'applicazione.

    Per esempio ho una serie di 5 Button (che prima non c'erano e a mano a mano si sono creati).

    Ogni volta che creo un Button lo faccio tramite una routine, la quale prima crea un oggetto generico Button, gli da tutti gli attributi del caso e gli assegna gli eventi.
    Poi inserisco quest'oggetto dentro l'arraylist e dentro la form.

    Ho quindi tre riferimenti all'oggetto.

    Al termine della routine il riferimento usato per crearlo scompare e quindi mi rimangono solo form e arraylist.

    Quando devo cancellare in blocco tutti i button mi servono, necessariamente, prima un ciclo che mi esamini uno ad un gli oggetti nell'arraylist, questo per permettere il Remove() dal form.

    Poi attuo il Clear() dell'arraylist.

    In questo momento i miei oggetti button non hanno più riferimenti

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    20
    be e allora il problema dov'è che sta?
    tramite la routine crei l'istanza dell'oggetto, assegni proprieta e tutto il resto, lo fai comparire sul form e lo aggiungi alla ArrayList, tramite il ciclo foreach cancelli mano a mano ogni comando e poi cancelli i riferimenti dalla ArrayList con Clear.
    E il problema allora dov'è?

  9. #9
    In linea di massima quando si lavora in .NET i problemi di allocazione/deallocazione non si pongono, il runtime fa tutto da sé (l'unica cosa di cui ci si potrebbe voler ricordare è di richiamare Dispose sulle classi che implementano IDisposable, ma questo non ha a che vedere con l'allocazione degli oggetti stessi).
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.