2010-04-12 9 views
28

Qual è la differenza tra un costruttore di moduli e il metodo form_Load?Modulo costruttore vs Form_Load

Qual è la tua procedura per mettere gli oggetti in uno contro l'altro?

risposta

16

Il codice nel costruttore viene eseguito immediatamente quando si crea il modulo, indipendentemente dal fatto che lo si mostri o meno. Il codice in esecuzione nell'evento Form.Load è un gestore di eventi, quindi è possibile avere codice in altre classi (che hanno sottoscritto il modulo) eseguendo il codice lì. Allo stesso modo, è possibile (dal modulo) utilizzare lo Form.OnLoad method per eseguire il codice.

L'evento Load del modulo (e il metodo sovrascrivibile OnLoad, che è spesso una scelta migliore nel modulo stesso) viene eseguito dopo che il modulo è stato inizializzato. Ciò presenta spesso vantaggi, dal momento che tutti i controlli del modulo sono già stati creati e, cosa più importante, si è verificato tutto il layout del modulo.

+0

Un paio di cose: 1- Quanto spesso costruisci un modulo senza mostrarlo? (Esp se le tue dipendenze sono iniettate correttamente con l'instanza ritardata), 2- Come notato da @Hans di seguito, si incorre in una penalizzazione delle prestazioni per qualsiasi inizializzazione del controllo a questo punto bc il layout non è sospeso quindi tutti i controlli sul modulo stanno cercando di rispondere a cose come gli eventi di riverniciatura durante l'inizializzazione. 3- Non userei OnLoad per chiamare il mio codice; piuttosto creare un metodo per MyAction() e chiamare MyAction() da OnLoad- altrimenti non è chiaro ai consumatori che hanno bisogno di chiamare OnLoad per eseguire MyAction – Fred

+1

@Fred Nulla di cui si discute sui conflitti con ciò che ho scritto. Ho specificamente menzionato che OnLoad si verifica dopo l'inizializzazione e non ha mai suggerito di aggiungere * controlli * in OnLoad. Per quanto riguarda il tuo punto 3. I consumatori non "chiamano mai OnLoad" - accade nel runtime. Se il codice non verrà riutilizzato in altre posizioni, non vi è alcun vantaggio significativo nell'introdurre un altro metodo. (Sono completamente d'accordo, tuttavia, se "MyAction" è qualcosa che verrà riutilizzato, dovrebbe essere nel suo stesso metodo - la mia risposta non preclude o suggerire diversamente, però) –

+0

Non pensare di aggiungere controlli- che dire del popolamento del drop bassi, elenchi, ecc.? Parlo per esperienza che è più lento fare in OnLoad. Il punto su MyAction era un'interpretazione (forse errata) della fine del tuo primo paragrafo. In generale, direi che una regola generale è di non fare nulla di "significativo" nell'onload. L'unica azione valida che riesco a pensare è qualcosa che richiede la conoscenza delle attuali informazioni di layout (ad esempio la dimensione della posizione/pixel del controllo). Si noti che questo è piuttosto discutibile del fatto che si stia seguendo uno schema di presentazione (ad es. MVP) in quanto il presentatore deve gestire l'inizializzazione dei dati. – Fred

27

Non utilizzare l'evento Load, sovrascrivere il metodo OnLoad(). Ciò garantisce che tutto sia eseguito in un ordine prevedibile quando si deriva dalla classe del modulo. Dovresti usarlo solo per l'inizializzazione del modulo che richiede la conoscenza della dimensione del modulo reale. Può essere diverso dalle dimensioni del disegno a causa del ridimensionamento o delle preferenze dell'utente e la dimensione effettiva non è nota fino a quando non viene creata la finestra nativa.

L'inizializzazione dei controlli nel metodo OnLoad è possibile ma può essere molto lenta, soprattutto per ListView e TreeView. Se li si inizializza nel costruttore, possono essere inizializzati alla rinfusa quando vengono creati i controlli nativi di Windows.

Un'eccezione speciale: la creazione di una finestra figlio MDI deve sempre essere eseguita in OnLoad(), c'è un errore nel codice dell'impianto idraulico che incasina la barra MDI quando si crea un figlio nel costruttore.

Problemi correlati