L'oggetto esiste fino a quando ci si riferisce da qualche parte, non disponga esplicitamente di non aiutare? [chiuso]

0

Sono un po 'perplesso sul motivo per cui questo non genera un'eccezione - credo che il CLR non cancelli l'oggetto perché c'è un riferimento ad esso?

static void Main(string[] args)
        {
            List<A> listOfA = new List<A>();

            A a = new A();

            listOfA.Add(a);

            ((IDisposable)a).Dispose();

            listOfA[0].Check(); //here I would expect and exception as the reference should point to an object that does not exist

        }
    }

    public class A : IDisposable
    {
        public A()
        {

        }
        public void Check()
        {

        }

        void IDisposable.Dispose()
        {

        }
    }
}

Nel mio attuale progetto, un oggetto può essere referenziato in molti posti ma dovrei assicurarmi che quando lo caccio esplicitamente, quei riferimenti genereranno un'eccezione. Non ho idea di come farlo, però.

    
posta John V 04.10.2017 - 19:22
fonte

1 risposta

2

I believe the CLR does not delete the object because there is a reference to it?

Sì, è il caso.

disposableObject.Dispose() in C # non dispone l'oggetto stesso, ma piuttosto offre all'oggetto l'opportunità di rilasciare le risorse che contiene. Lo farebbe, a sua volta, chiamando Dispose() sui suoi membri.

Questo è particolarmente importante se le risorse sono risorse del sistema operativo come maniglie che si riferiscono a file e così via.

L'oggetto potrebbe anche "lasciar andare" la memoria se lo desidera, impostando i suoi membri di riferimento su null. Tuttavia, questo in genere non è fatto perché (1) questo non recupera immediatamente questi oggetti anche se non sono più referenziati, e (2) il GC rivendicherà comunque gli oggetti come un gruppo.

    
risposta data 04.10.2017 - 19:54
fonte

Leggi altre domande sui tag