2009-11-20 22 views
6

Ho due caselle di testo e voglio saltare un blocco di codice solo quando entrambi sono vuoti:Perché questa istruzione IF restituisce false?

if (txtBox1.Text.Trim() != string.Empty && txtBox2.Text.Trim() != string.Empty) 
{ 
    // Do something 
} 

Se una delle caselle di testo ha qualcosa, voglio che la // Fai qualcosa parte eseguire. Solo quando entrambi sono vuoti, voglio saltare.

Tuttavia, il suddetto frammento di codice non funziona. Perché?

+2

String.IsNullOrEmpty è un bel metodo di supporto per verificare stringhe vuote o nulle –

+0

@jstawski: Buona chiamata, anche se, a dire il vero, non ho mai visto una proprietà 'TextBox.Text' che restituisce' null' (non per presumere che io sono un esperto in materia). –

risposta

24

Credo che i vostri operatori logici siano confusi. Quello che stai cercando è

if (txtBox1.Text.Trim() != string.Empty || txtBox2.Text.Trim() != string.Empty) 
{ 
    // Do something 
} 
+0

Oh grazie, sono nuovo di C# e non ha visto l'ovvio.Grazie! –

+2

È più un errore logico generale di un C# Per informazioni di interesse su [Contrapositives] [1]. [1]: http: //en.wikipedia. org/wiki/Contraposition – Marius

11

È necessario sostituire il && con ||. Attualmente, il codice nel blocco if verrà eseguito solo se entrambi i campi di testo contengono del testo.

+0

Non so chi ti ha downvoted :(Ma grazie per le informazioni –

+0

Dovrebbe essere un upvote, ma sono stato chiamato dalla mia scrivania per qualche minuto e ora non posso cambiarlo :-( – Sukotto

+0

@Sukotto: Basta fare clic sulla freccia su e dovrebbe cambiare il tuo voto.Non funziona? –

3

Si desidera || invece di & &.

1
if (txtBox1.Text.Trim() != string.Empty || txtBox2.Text.Trim() != string.Empty) 
{ 
    // Do something 
} 

Si utilizza && che richiedono sia di loro non sia vuota. Dovresti usare || (OR) per ottenere il risultato desiderato.

0

potrebbe essere più facile da capire:

if (!(txtBox1.Text.Trim() == string.Empty && txtBox2.Text.Trim() == string.Empty)) 
{ 
    // Do something 
} 
6

Coloro che ha sottolineato è necessario || invece di & & avete ragione. Se si preferisce & &, si potrebbe anche usare:

if (!(txtBox1.Text.Trim() == string.Empty && txtBox2.Text.Trim() == string.Empty)) 
{ 
    // Do something 
} 

La differenza è puramente estetico, ma equivale a controllo (in inglese): "E 'Non è vero che entrambe le caselle di testo sono vuote" in contrasto con "È vero che almeno una casella di testo non è vuota." Stesso significato, diverso modo di metterlo.

Per la cronaca, il modo in cui l'avevi nella tua domanda originale era: "È vero che entrambe le caselle di testo non sono vuote."

2

Ho diviso BothBoxesEmpty in una variabile separata per renderlo più leggibile ... tutte le parentesi diventano un pasticcio illeggibile altrimenti. È possibile unire le due dichiarazioni se si sceglie:

bool BothBoxesEmpty = string.IsNullOrEmpty(TextBox1.Text.Trim()) && 
         string.IsNullOrEmpty(TextBox2.Text.Trim()); 
if (!BothBoxesEmpty) 
{ 
    /* Do your stuff */ 
} 

Si potrebbe altrettanto facilmente sostituire lo string.IsNullOrEmpty con TextBox1.Text.Trim() == string.Empty come TextBox1.Text restituisce sempre una stringa (vuoto o no) e non sarà mai tornare null.

0

Se sei in un metodo che si possa fare qualcosa di simile, così:

if (txtBox1.Text.Trim() == string.Empty && txtBox2.Text.Trim() == string.Empty) 
     return; 
//Do Something 
0

si potrebbe rendere più concisa concatenando le corde, poi prova:

if ((txtBox1.Text.Trim() + txtBox2.Text.Trim()) != string.Empty) 
{ 
    // Do something 
} 

A seconda ciò che le scatole rappresentano questo potrebbe essere in qualche modo meno ovvio, però.

0

Questo mi ricorda una storia che ho sentito di un programmatore junior che è stato detto di implementare le regole per il calcolo delle prestazioni assicurative, dove "tutti sotto i 18 e oltre 65" non si qualifica. Così ha codificato come:

if (age < 18 and age > 65) ... 

La storia racconta che i suoi colleghi hanno cercato più volte di convincerlo che la sua logica non avrebbe funzionato correttamente, ma ha ostinatamente rifiutato di capire o cambiarlo.

+0

Immagino che sia il prodotto della traduzione diretta della dichiarazione in inglese ... :) –

Problemi correlati