Можно ли в C # оценить, отличается ли переменная от нуля, без использования оператора? - PullRequest
1 голос
/ 11 марта 2010

Например, можно ли написать это

if (переменная! = Ноль)

без использования оператора! = Или ==?

Ответы [ 6 ]

9 голосов
/ 11 марта 2010

Ну, я бы просто использовал == (если вы пытаетесь избежать пользовательского оператора равенства, возможно, приведите к object - это все равно будет nop)

Кроме того, мои деньги будут идти с object.ReferenceEquals(obj, null), но вы также можете использовать object.Equals(obj, null), поскольку он обрабатывает null и т. Д.

Для полноты: зачем мне просто использовать == / !=? Просто: компилятор может сделать это напрямую . IL для нулевой проверки объекта на самом деле:

  • загрузить ссылку
  • ответвление, если true (или ответвление, если false)

Вот и все. Две инструкции IL. Он даже не выполняет «проверку загрузки на нулевое значение, равенство» - поскольку определение «истина» - это «все, что не равно 0 / пусто», а «ложь» - «0 / пусто».

Для чего-то вроде ReferenceEquals, то есть:

  • загрузить ссылку
  • загрузить ноль
  • вызов метода
  • (который создает фрейм стека)
  • загрузить первый аргумент
  • загрузить второй аргумент
  • сделать проверку на равенство
  • (затем передает значение обратно в кадр стека, возвращая true / false)
  • ответвление, если true (или ответвление, если false)

Я знаю, какой я предпочитаю ...

5 голосов
/ 11 марта 2010

Вы можете использовать object.ReferenceEquals(variable, null).

2 голосов
/ 11 марта 2010

Вы действительно можете быть придурком и использовать:

if (x is object) {
    // not null
}
else {
    // null
}
2 голосов
/ 11 марта 2010

Вызовите ToString () для него, если вы получили исключение System.NullReferenceException, которое было нулевым. : -)

Но почему?

1 голос
/ 11 марта 2010

Как бы вы проверили, если что-то не имеет значения, если вы не хотите использовать оператор? В чем причина этого вопроса?

0 голосов
/ 11 марта 2010

Ну, единственный другой синтаксис, который подходит вашему описанию, это использовать ?? оператор, (который все еще является оператором, я думаю ...), но он либо возвращает значение, либо, если значение равно нулю, возвращает следующее значение выражения, как в

 string nullStr = null;
 string out1 = nullStr?? "NullString";    // out1 = "NullString";
// ------------------------------------------------------------
 string realStr = "RealString";
 string out2 = realStr ?? "NullString";   // out2 = "RealString";
...