47 messaggi dal 16 aprile 2008
www.pollosky.it
Ciao a tutti, vorrei dei chiarimenti sull'implementazione dell'interfaccia IDisposable. Vi posto un codice di esempio:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            TestObject a = new TestObject();
            a.Dispose();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            GC.Collect();
        }
    }

    public class TestObject : IDisposable
    {
        public TestObject() //Costruttore
        {
            Console.WriteLine("Costruttore");
        }

        ~TestObject() //Finalize
        {
            Dispose(false);
            Console.WriteLine("Distruttore");
        }

        #region IDisposable

        protected bool _disposed;

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                if (disposing)
                {
                    Console.WriteLine("Dispose");
                }
                _disposed = true;
            }
        }

        #endregion
    }


Facendo le prove con questo codice ho visto che se io metto a commento la chiamata esplicita al metodo "Dispose" (a.Dispose) nel momento in cui forzo GC.Collect viene invocato il distruttore dell'oggetto TestObject; quindi, se non ho capito male, l'oggetto viene cancellato fisicamente dalla memoria (come è giusto che sia). Mentre se io richiamo il metodo "Dispose" e successivamente forzo il GC.Collect il distruttore della classe non viene più invocato e questo perché, se non ho capito male, l'istruzione "GC.SuppressFinalize(this)" comunica al GC che non è necessario fare il "finalize" dell'oggetto perché è già stato fatto il Dispose...ma facendo in questo modo l'oggetto fisicamente risiede ancora in memoria? Oppure viene comunque cancellato? Se si, in che modo?

Ho inserito il "GC.SuppressFinalize" perché in rete ho visto che molte implementazioni dell'interfaccia IDisposable lo consigliano, è effettivamente un vantaggio? Quale è il modo migliore di implementare IDisposable?

Vi ringrazio in anticipo per ogni chiarimento in merito.

Luca
47 messaggi dal 16 aprile 2008
www.pollosky.it
Come non detto...facendo altri test credo di aver capito come si comporta.

Quando passa nel "finalize" in realtà l'oggetto viene solo "marcato" come cancellabile dal garbage collector che effettivamente lo elimina al successivo ciclo di riciclo.

Il SuppressFinalize invece ottimizza le cose perché comunica al GC che può cancellare fin da subito l'oggetto in quanto è già stato fatto il dispose (e quindi il rilascio di eventuali risorse collegate all'oggetto).

Confermatemi se ho capito bene...thanks

Luca

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.