2009-11-20 17 views
6

Tengo dos cuadros de texto y quiero saltar un bloque de código única cuando ambos están vacíos:¿Por qué esta declaración IF devuelve falso?

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

Si cualquiera de los cuadros de texto tiene algo, quiero que el // Hacer algo parte de ejecutar. Solo cuando ambos están vacíos, quiero omitir.

Sin embargo, el fragmento de código anterior no funciona. ¿Por qué?

+2

String.IsNullOrEmpty es un buen método de ayuda para comprobar cadenas vacías o nulas –

+0

@jstawski: Buena llamada, aunque para ser sincero, nunca he visto una propiedad 'TextBox.Text' devolviendo' null' (no presumir I soy un experto en el tema). –

Respuesta

24

Creo que tiene sus operadores lógicos mezclados. Lo que usted está buscando es

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

Oh gracias, soy nuevo en C# y no vio lo obvio. ¡Gracias! –

+2

Es más un error lógico general que uno C#. Para más información sobre [Contrapositives] [1]. [1]: http: //en.wikipedia. org/wiki/Contraposition – Marius

11

Debe reemplazar su && con ||. Actualmente, el código en el bloque if solo se ejecutará si ambos campos de texto tienen texto.

+0

No sé quién le votó negativamente :(Pero gracias por la información. –

+0

Debería haber sido un voto positivo, pero me llamaron desde mi escritorio por unos minutos y ahora no puedo cambiarlo. :-( – Sukotto

+0

@Sukotto: Simplemente haga clic en la flecha hacia arriba y debería cambiar su voto. ¿No está funcionando? –

3

Quiere || en lugar de & &.

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

está usando el && que requieren tanto de ellos sea no está vacío. Debe usar || (O) para obtener el resultado deseado.

0

podría ser más fácil de entender:

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

Los que señaló que necesita || en lugar de & & tienen razón. Si prefiere & &, también se puede utilizar:

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

La diferencia es puramente estético, sino que equivale a comprobar (en Inglés): "Es no es cierto que los dos cuadros de texto están vacíos" en lugar de "Es cierto que al menos un cuadro de texto no está vacío". Mismo significado, diferente forma de expresarlo.

Para el registro, la forma en que lo tenía en su pregunta original: "Es cierto que los dos cuadros de texto no están vacíos."

2

he dividido el BothBoxesEmpty a cabo a una variable independiente para que sea más fácil de leer ... todos los soportes de convertirse en un lío ilegible lo contrario. Puede combinar las dos afirmaciones si lo desea:

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

Usted puede igualmente reemplazar fácilmente el String.IsNullOrEmpty con TextBox1.Text.Trim() == string.Empty como TextBox1.Text siempre devolverá una cadena (vacío o no) y nunca volverá null.

0

Si estás en un método que podría hacer algo como esto, así:

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

Usted puede hacer que sea más concisa mediante la concatenación de las cadenas, luego las pruebas:

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

Dependiendo Sin embargo, lo que las cajas representan esto podría ser algo menos obvio.

0

Esto me recuerda una historia que escuché sobre un codificador junior al que se le dijo que implementara reglas para calcular los beneficios del seguro, donde "todos menores de 18 y mayores de 65" no calificaron. Así que se codificó como:

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

La historia cuenta que sus compañeros de trabajo trataron repetidamente de convencerlo de que su lógica no funcionaría correctamente, pero él se negó obstinadamente a entender o cambiarlo.

+0

Supongo que es producto de la traducción directa de la declaración en inglés ... :) –

Cuestiones relacionadas