2009-08-20 7 views
17

Estaba escribiendo código hoy y algo no funcionaba como esperaba.Anulación de C# Problema de las declaraciones condicionales

¿Por qué se ejecuta el siguiente código aunque la condición se haya evaluado como falsa?

alt text http://img215.imageshack.us/img215/3011/agfewrf.gif

He intentado poner los apoyos en torno a las dos condiciones, y cambiar su posición, pero el EndedUsingApplication incluso todavía ejecuta.

EDIT:

No tiene nada que ver con el || o & & operadores. Mira esto ...

alt text http://img20.imageshack.us/img20/6655/aaaaaal.gif

Nadie puede aprender de mi error a menos que publico el código culpable, así que aquí está.

public static bool operator ==(ActiveApplication a, ActiveApplication b) 
    { 
    if ((object)a == null || (object)b == null) 
     return false; 
    return a.process_name == b.process_name && a.window_title == b.window_title; 
    } 

    public static bool operator !=(ActiveApplication a, ActiveApplication b) 
    { 
    return a == b ? false : true; 
    } 

Y aquí es el código de trabajo ...

public static bool operator ==(ActiveApplication a, ActiveApplication b) 
    { 
    // Casting to object class prevents this comparison operator being executed 
    // again and causing an infinite loop (which I think .NET detects and stops 
    // but it would still be a huge hole in the logic. 
    if ((object)a == null && (object)b == null) 
     return true; 
    if ((object)a == null^(object)b == null) 
     return false; 
    return a.process_name == b.process_name && a.window_title == b.window_title; 
    } 

    public static bool operator !=(ActiveApplication a, ActiveApplication b) 
    { 
    return a == b ? false : true; 
    } 

El problema parecía ser cuando el operador! = Recibió dos valores nulos.

+0

¿Se puede publicar ese código? – danish

+0

@Jay Riggs: ¡Bingo! Sí, resulta que tengo. Hay una mala lógica que está devolviendo un resultado incorrecto. Escriba una respuesta adecuada y tal vez la marque como la respuesta;) – Nippysaurus

+0

@Nippy - ¡Agregue una respuesta! ¡Gracias! –

Respuesta

51

¿Ha sobrecargado !=?

+0

Consulte la pregunta original para obtener una explicación. – Nippysaurus

+0

Guau, genial llamada. –

+0

Creo que hay una lección que aprender aquí –

3

No estoy seguro de por qué. Pero, ¿estás seguro de que la aplicación en ejecución se compila utilizando el código que estás atravesando? He visto este tipo de cosas cuando el código es diferente de lo que realmente se está ejecutando.

1

¿Su programa tiene múltiples hilos?

He visto situaciones en las que compruebo un valor y luego trato de usarlo solo para encontrar su cambio. Lo que sucedió es que otro hilo cambió el valor después de que lo revisé, pero antes lo usé.

1

¿Estás seguro de que estás en la línea que has resaltado? Puede hacer clic en la ventana de la pila de llamadas y hacer que cualquier parte de la pila se convierta en la línea "actual" en el sentido de que puede obtener el valor de las variables allí y así sucesivamente.

El punto es, quizá EndedUsingApplication establece ActiveApplication a nulo, por lo que no era ActiveApplication nula cuando evaluó el caso, pero ahora es nula cuando se está evaluando en el depurador.

¿Ha puesto un punto de interrupción en la línea EndedUsingApplication (ActiveApplication) para asegurarse de que ActiveApplication sea nulo antes de ejecutar esa línea?

1

Creo que un mejor enfoque es utilizar Object.ReferenceEquals, ya que es más explícito:

public static bool operator ==(ActiveApplication a, ActiveApplication b) 
    { 
    // same reference so equals is true - will be true for null == null 
    if (object.ReferenceEquals(a, b)) 
     return true; 

    // one is null and the other is not 
    if (object.ReferenceEquals(a, null) || object.ReferenceEquals(b, null)) 
     return false; 

    // dealt with all combinations of null - compare fields 
    return a.process_name == b.process_name && a.window_title == b.window_title; 
    } 

    public static bool operator !=(ActiveApplication a, ActiveApplication b) 
    { 
    return !(a == b); 
    } 
Cuestiones relacionadas