2014-05-07 6 views
7

Sto tentando di cancellare tutti gli elementi da un oggetto ToolStripDropDownButton. Dato che sono monouso, chiamo il metodo di smaltimento su ognuno di essi. Ma vedo che dopo aver chiamato il metodo dispose(), la proprietà IsDisposed restituisce ancora false. Perché è così e come posso verificare se Dispose() è chiamato su qualsiasi oggetto? Non è un problema (spero) nel mio progetto attuale, ma mi piacerebbe davvero sapere cosa sta succedendo qui ...Perché IsDisposed restituisce false dopo aver chiamato Dispose()?

mio codice finora:

private void ClearDropDownAccessConnections() 
{ 
    ToolStripItem button = null; 

    for (int i = toolStripDropDownButtonAccess.DropDownItems.Count - 1; i > 0; i--) 
    { 
     button = toolStripDropDownButtonAccess.DropDownItems[i] as ToolStripItem; 
     if ((button.Tag != null) && ((int)button.Tag == 10)) 
     { 
      toolStripDropDownButtonAccess.DropDownItems.Remove(button); 
      button.Dispose(); 
      //IF I CHECk HERE THEN button.IsDisposed IS STILL FALSE    } 
     } 
    } 
+0

ToolStripItems sono controlli "snelli", non utilizzano una finestra. E non derivare dalla classe Control. Ciò significa spesso che in realtà non hanno nulla che valga la pena smaltire. Li rende anche molto buggy. –

+0

[Ulteriori informazioni su 'IDisposable'] (http://stackoverflow.com/a/538238/2478357). – Loetn

risposta

4

Per qualunque sia la loro ragione , gli sviluppatori .NET originali hanno deciso di capovolgere il flag IsDisposed solo se la proprietà disposta non è una proprietà (che si sta gentilmente indirettamente impostando sulla riga null). Ciò non sembra avere alcun impatto ulteriore - ad esempio, si può supporre che lo ToolStripItem sia disposto in modo sicuro nonostante questo comportamento strano.

Per quanto riguarda la tua domanda più ampia - l'interfaccia IDisposable non fornisce alcun modo per verificare se l'oggetto era disposto (e come se non bastasse - classi di attuazione non è necessario garantire un'esecuzione senza eccezione, se si chiama più di una volta (vedi MSDN)). È necessario affidarsi agli sviluppatori di dette classi per fornire alcune informazioni se l'oggetto è stato effettivamente disposto (che come può essere visto nell'esempio ToolStripItem non è un metodo infallibile) o tracciare questo in qualche modo nel codice.

Detto questo, raramente diventa un problema negli scenari della vita reale (anche se è utile esserne a conoscenza).

+0

Perché gli sviluppatori .NET non ci forniscono un metodo .Free come in Delphi. – GuidoG

+0

@ user3611669 Principalmente perché una delle principali idee alla base di .NET è che non è necessaria una funzione '' Libero' ', cioè la memoria è gestita dall'ambiente runtime, non dallo sviluppatore (non voglio entrare in una discussione sui professionisti e contro). .NET's 'Dispose'! = Delhpi's' Free' (almeno per il meglio della mia comprensione limitata di Delphi), come nella maggior parte degli scenari normali 'Dispose' non influenzerà la quantità di memoria libera. – decPL