Подтвердить что ты не робот

Переопределение проблемы с С#

Сегодня я писал некоторый код, и что-то не работало, как я ожидал.

Почему следующий код выполняется, хотя условие должно было иметь значение false?

альтернативный текст http://img215.imageshack.us/img215/3011/agfewrf.gif

Я попытался поставить скобки вокруг двух условий и изменить их положение, но приложение EndedUsingApplication даже все еще выполняется.

РЕДАКТИРОВАТЬ:

Это не имеет ничего общего с || или && операторы. Посмотри на это...

alt text

Никто не может извлечь уроки из моей ошибки, если я не отправлю код виновника, так что вот оно.

  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;
     }

А вот и рабочий код...

  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;
     }

Проблема заключалась в том, что оператор! = Получил два нулевых значения.

4b9b3361

Ответ 1

Вы перегрузили !=?

Ответ 2

Не знаю, почему. Но вы уверены, что запущенное приложение скомпилировано с использованием кода, который вы выполняете. Я видел такие вещи, когда код отличается от того, что на самом деле выполняется.

Ответ 3

Является ли ваша программа многопоточной?

Я видел ситуации, когда я проверяю значение, а затем пытаюсь использовать его только для того, чтобы его изменить. Случилось так, что другой поток изменил значение после того, как я его проверил, но до того, как я его использовал.

Ответ 4

Вы уверены, что находитесь на линии, которую вы выделили? Вы можете щелкнуть по окну стека вызовов и сделать любую часть стека вызовов "текущей" строкой в ​​том смысле, что вы можете получить значение переменных там и т.д.

Точка, возможно, EndedUsingApplication устанавливает значение ActiveApplication равным null, так что ActiveApplication не был null, когда он оценивал if, но теперь он имеет значение null, когда вы оцениваете его в отладчике.

Вы поставили точку останова в строке EndedUsingApplication (ActiveApplication), чтобы убедиться, что ActiveApplication имеет значение null, прежде чем выполнить эту строку?

Ответ 5

Я думаю, что лучший подход - использовать Object.ReferenceEquals, поскольку он более явный:

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);
     }