С#: сравнение с нулевым
Являются ли эти эквиваленты:
if (null==myobject)
{
//do something
}
и
if (myobject==null)
{
//do something
}
или они будут создавать другой код?
Ответы
Ответ 1
В 99% случае этот код эквивалентен.
Единственное исключение - когда тип рассматриваемого объекта переопределяет оператор ==. Возможно, что ошибка возникает в ==, которая вызывает проблемы, когда один параметр имеет значение null.
Частным примером, который я видел ранее, является следующий
public static bool operator==(Student left, Student right) {
return left.Equals(right);
}
Это не удастся, если значение null находится слева, но, скорее всего, не будет иметь нулевое значение справа.
Это довольно удаленный угол.
Ответ 2
Форма оператора "if
", которая ставит константу слева, представляет собой сохранение из C/С++, где вы можете иметь произвольное выражение в выражении if.
Синтаксис С# для операторов if требует, чтобы выражение оценивалось в bool, что означает, что if (foo = 0)
не будет компилироваться.
Ответ 3
if (null==myobject) {
- безопасный способ написания оператора if. Он исходит из C/С++, где условие является выражением, вычисленным для int
. Если результат равен нулю, что означает false
, все остальное - true
. Вы могли бы написать что-то вроде
if (variable == 1) {
но если вы не будете осторожны, вы также можете написать
if (variable = 1) {
в этом случае у вас есть задание, которое всегда оценивается как 1 и, следовательно, всегда верно.
Вы можете скомпилировать это и запустить его без проблем, но результат не будет тем, что вы ожидали. Поэтому программисты C/С++ начали писать такие вещи, как
if (1 == variable) {
Это не скомпилируется, если вы опечатаете его, поэтому вам всегда приходилось писать его, как вы хотели его написать. Это позже становится (хорошей) привычкой, и вы используете его на всех языках, с которыми вы работаете, например с С#.
Ответ 4
Для тех, кто его пропустит, если вы хотите уменьшить беспорядок, также можно включить C-language
-уровень проверки нуля для ваших классов C#
:
class MyObj
{
public void implicit_null_comparison_demo()
{
MyObj mo = null;
// ...
if (mo) // <-- like so (can also use !mo)
{
// it not null...
}
else
{
// it null...
}
}
public static implicit operator bool(MyObj mo)
{
return (Object)mo != null;
}
};
Ответ 5
Как отмечают другие, они в основном эквивалентны.
Вы также должны посмотреть:
http://en.wikipedia.org/wiki/Null_Object_pattern
Это очень полезная альтернатива просто проверке нулевой ссылки.