quando scrivi
dt = New DataTable
viene creato in memoria un oggetto DataTable vuoto. Nell'istruzione successiva, internamente, la funzione ds.Tables crea un altro oggetto DataTable e ne assegna il riferimento a dt.
A questo punto in memoria ci sono due oggetti dataTable di cui uno 'appeso' e pronto per essere eliminato dal GC. Il problema è che gli oggetti IDisposible devono essere eliminati manualmente per diversi motivi tra cui il fatto che in alcuni casi non possono nemmeno essere eliminatidal GC.
Comunque oggetti IDisposable o no, questo tipo di errore va sempre evitato anche se a dire il vero il JIT (che ha il compito di tradurre a runtime il codice MSIL in codice nativo) dovrebbe riconoscere l'inutilità di quella assegnazione ed eliminarla automaticamente senza nemmeno eseguirla.
qualche altro tip:
l'ordine dei dispose a volte (quindi per non sbagliare, sempre) è importante, richiamali in ordine inverso rispetto alle assegnazioni.
quando chiami dispose nei blocchi finally fai sempre cosi:
infatti nel tuo codice, se un eccezzione venisse sollevata in fase di apertura della connessione verrebbero chiamati dei dispose su oggetti che non sono stati ancora assegnati sollevando ulteriori eccezioni dal finally.codice:If TypeOf dt Is IDisposable Then dt.Dispose() End If

) è importante, richiamali in ordine inverso rispetto alle assegnazioni.
Rispondi quotando