[VB 2010] Distruggere un'istanza di una classe

giovedì 19 aprile 2012 - 23.38
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows 7  |  Windows Vista  |  Windows XP

gabry90 Profilo | Newbie

salve a tutti. data una classe istanziata così:

Public Class Prova Protected _METODO1 As Integer Protected _METODO2 As Integer Public Sub New() 'code... End Sub Public Overridable Property Metodo1() As Integer Get Return _METODO1 End Get Set (value As Integer) _METODO1 = value End Set End Property Public Overridable Property Metodo2() As Integer Get Return _METODO2 End Get Set (value As Integer) _METODO2 = value End Set End Property End Class

Come faccio a distruggerla. Ammettiamo che io da un modulo esterno abbia richiamato tante volte questa classe così:

Public Class ProvaIstanza Dim IProva As Prova Public Sub Istanzia() For i As Integer = 0 To 5 IProva = New Prova() Next End Sub End Class

Anche se non avrebbe senso questa dicitura (a me non interessa se ha senso o no, quindi evitate di dire "quello che hai scritto non ha senso" perché é solo un esempio) vorrei capire come eliminare per esempio l'istanza n°2 della classe Prova. Ammettendo le istanze di una classe si possano inserire in una lista cosi da essere recuperabili come posso eliminarne una, o meglio, come posso distruggerla liberando le risorse ad essa allocata?

InsettoScoppiettato Profilo | Junior Member

Supponi di avere una lista di questo tipo (scrivo C# ma la cosa è equivalente):

List<Prova> listaGrande = new List<Prova)(); for (int i = 0; i < 5; i++) { Prova dummyIstanza = new Prova(); dummyIstanza._METHOD1 = 5; dummyIstanza._METHOD2 = 15; listaGrande.Add(dummyIstanza); }
poi pui cancellare l'elemento 2 come

listaGrance.RemoveAt(1);
oppure cicli di nuovo a 1 a 5, associ una variabile di tipo prova (chiamala per esempio nel ciclo for dummyVar) all'elemento listaGrande[i] e poi esegui
listaGrande.Remove( dummyVar).
Sotto .NET non distruggi mai variabili autonomamente, c'è il Garbage Collector che lo fa per te quando l'heap è pieno e serve altro spazio per allocare nuove variabili.

L'unico modo per avere più controllo è prevedere un override del metodo Dispose che eredita da object per controllare meglio le risorse che deallochi, ma questo non serve nel tuo caso e comunque non ti da il controllo di quanod il metodo dispose viene eseguito.


Alessandro Parma
Programmazione multipla scoposta con prognosi ancora da definire

gabry90 Profilo | Newbie

salve. grazie della risposta ma avevo gia pensato ad una soluzione del genere. il fatto è che il problema è piu grande di quanto tu pensi.

La classi che istanzio sono tutti oggetti che utlizzo nel rendering di un gioco (vedi topic OpenGL in VB.NET) 2D utilizzando il framwork XNA 4.0. Il problema grosso e che questo piccolo problema è legato strettamente ad un'altro problema e cioè: se io ho 6 nemici avro 6 classi istanziate come nemico, se io ho 56 proiettili avro 56 classi istanziate come proiettili. Quindi a me importa se e quando il garbagecolletcot dealloca le risorse perchè se ho la memoria piena e mi dealloca per esempio un proiettile che doveva continuare la cua corsa mi manda in crash l'applicazione. Quindi chiedo gentilmente, come faccio a risolvere il problema su una classe proiettile? e possibile istanziare una sola volta la classe proiettile e poi riutilizzarla nel disegno per il rendering. Confido che se mi aiutate a risolvere questo problema in automatico risolvo anche il problema della distruzione di un'istanza :)

InsettoScoppiettato Profilo | Junior Member

Oddio quanti problemi, arrivano addirittura a fare una matrioska...secondo me sei spacciato.

Ripeto, non puoi controllare quando il Garbage Collector elimina un'istanza. Però viene a tuo favore il fatto che il Garbage collector è stato pernsato per lavorare a tuo favore e non per rovinarti il codice mentre questo gira: il Garbage collector elimina solo istanza che non sono più linkate da nessuna variabile raggiungibile a livello codice.
In altri termini, il GC eliminerà (se e quando a sua discrezione...) solo le variabili di tipo proiettile che non stanno più sulla lista, ovvero quelle che sono state precendentemente sottoposte a Remove().

Per esempio se tu esegui un comando di questo tipo (dopo aver caricato al lista come ti dicevo prima):

listaGrande[3] = new Prova();
in pratica stai creando una nuova classe di tipo prova e la stai referenziando tramite una variabile chiamata listaGrande[3], che è raggiungibile a livello di codice chiamando semplicemente la quarta posizione di listaGrande. Finchè esisterà listaGrande tutte le 5 istanze che essa referenzia (di tipo Prova) non verranno mai cancellate.
Verrà invece cancellata (ripeto: non sai quando però) la vecchia istanza che stava nella posizione a indice 3 (quindi la 4a variabile) di listaGrande.

Del resto non ti troverai mai ad avere problemi di ram insufficiente per colpa del GC, se c'è qualcosa di eliminabile, verrà elimintao alla prima richiesta di nuova ram da usare per nuove variabili.

SIcuramente il problema non è qui.
Alessandro Parma
Programmazione multipla scoposta con prognosi ancora da definire

gabry90 Profilo | Newbie

grazie dell'attenzione. apro un nuovo topic sul gioco...invito a qìguardare che sono pieno di problemi e dubbi per la tua felicità ovviamente :)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5