2015-04-17 11 views
7

Sto lavorando per personalizzare (e risolvere) una grande applicazione per un cliente che è stato acquistato da un'altra fonte. Il codice che abbiamo finito per ottenere era sicuramente NON il codice effettivo utilizzato in produzione dal client di origine. Detto questo, mi sono imbattuto in questo oggi:Un evento TextChanged si attiva se il testo non è cambiato?

if (lblCurrentValueOfContractAmount.Text == "0.0") 
    lblCurrentValueOfContractAmount.Text = "0.0"; 

E no, non sto scherzando. La mia prima inclinazione è stata quella di rimuoverlo, poi ho iniziato a parlare con un altro sviluppatore che ha detto che potrebbe esserci qualche roba clandestina in corso qui, come qualcuno che ha sottoscritto il testo dell'etichetta che viene modificato, ecc. Onestamente non ne sono molto preoccupato , quindi sto solo andando a lasciarlo in Tuttavia, questo mi porta alla mia domanda:.

Supponiamo che ci sia qualcuno sottoscritto TextChanged, per esempio. Se il testo non cambia in realtà, il compilatore ottimizzerebbe l'intera affermazione? L'evento avrebbe effettivamente sparato?

+0

È il == nella seconda riga dovrebbe essere un singolo =? – adv12

+0

ah, sì, mi dispiace. modificato. – DrewJordan

+8

Non ci vorrebbero meno di cinque minuti per controllarsi? Nuovo Winform -> aggiungi casella di testo -> imposta il punto di interruzione nel testo evento modificato -> da qualche altra parte, chiama 'textbox1.Text = textbox1.Text;' –

risposta

3

Supponendo di avere un'etichetta Winforms (o un'altra classe derivata da Control), il codice non genererà un evento di modifica e pertanto tale codice non ha effetti collaterali e può essere rimosso. http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Control.cs,9884211b7ff61817

 public virtual string Text { 
     get { ... } 

     set { 
      if (value == null) { 
       value = ""; 
      } 

      if (value == Text) { 
       return; 
      } 
      // omitted remainder 
     } 
    } 
+0

grazie! Ho appena trovato questo link dal tuo commento. – DrewJordan

0

Il compilatore non lo ottimizzerà a meno che non si possa dimostrare che non ha effetti collaterali. Se ha effetti collaterali è una questione di esattamente ciò che fa il metodo di settaggio proprietà Text. Ciò che fa questo setter dipende dallo scrittore di quel metodo. Un buon comportamento è verificare se il testo è effettivamente cambiato e attivare l'evento TextChanged solo se si è verificato un cambiamento reale. Ma non puoi semplicemente fidarti dello sviluppatore originale: è il momento di fare qualche test per conto tuo. Agganciare l'evento TextChanged e vedere se si attiva quando si imposta, ma in realtà non cambia, il testo.

0

L'evento non si attiva più e più volte.

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    // This does not cause the event to continuously fire 
    textBox1.Text = textBox1.Text; 
} 

ho impostato la casella di testo inizialmente di avere il valore "0.0" e poi ha fatto questo:

private void Form1_Load(object sender, EventArgs e) 
{ 
    textBox1.Text = "0.0"; 
} 

Questo non ha causato l'TextChangedEvent al fuoco.

Problemi correlati