Seguente joelonsoftware da lungo tempo, poster stackoverflow 1a volta.Accedere alla proprietà Text di un controllo dopo il modulo principale Dispose() 'd?
voglio sapere "come in modo sicuro" Posso fare quanto segue (C#):
Form formDlg = new Form();
TextBox box = new TextBox();
formDlg.Controls.Add(box);
formDlg.ShowDialog();
formDlg.Dispose();
string sUserEntered = box.Text; // After parent Dispose'd!
In pratica, questo (apparentemente) funziona, perché scatola (come controllo) ha un private text field (una stringa) che utilizza per implementare la sua proprietà Text dopo che il suo handle di finestra è stato distrutto.
Non sarò soddisfatto da una risposta generica che "non è possibile accedere a un oggetto dopo che è stato eliminato" perché (1) non riesco a trovare alcuna proibizione generale in documenti MS, (2) I'm non accedere a una risorsa non gestita e (3) questo codice non genera alcuna eccezione (inclusa ObjectDisposedException).
Vorrei farlo in modo da poter creare e utilizzare un metodo "ShowAndDispose" combinato per ridurre il rischio di dimenticare di chiamare sempre Dispose() dopo ShowDialog().
Per complicare, il comportamento cambia nel debugger. Se mi rompo prima di Dispose(); quindi Quick Watch box e drill down nella sua classe di base Control; quindi oltrepassare Dispose(); quindi box.Text restituisce ""! In altri scenari box.Text restituisce il testo inserito dall'utente.
Perché dovresti forzare un Dispose sul modulo? Soprattutto quando non si accede a risorse non gestite. Lascia che il framework/GC si prenda cura di esso. EDIT: Ho la sensazione che tu abbia una situazione molto più complicata del codice sopra. – Zyphrax
Non solo, perché accedere a una casella di testo su un modulo che è dispose() ...? perché vorresti farlo? Non ha senso per me? È come puntatori in C, tu malloc un puntatore, fai qualche cosa con esso, quindi liberalo, quindi denothi il puntatore dopo essere stato liberato! – t0mm13b
Zyphrax: un modulo contiene molte risorse non gestite, 1 per controllo. –