Являются ли эти эквиваленты:
if (null==myobject)
{
//do something
}
и
if (myobject==null)
{
//do something
}
или они будут создавать другой код?
Являются ли эти эквиваленты:
if (null==myobject)
{
//do something
}
и
if (myobject==null)
{
//do something
}
или они будут создавать другой код?
В 99% случае этот код эквивалентен.
Единственное исключение - когда тип рассматриваемого объекта переопределяет оператор ==. Возможно, что ошибка возникает в ==, которая вызывает проблемы, когда один параметр имеет значение null.
Частным примером, который я видел ранее, является следующий
public static bool operator==(Student left, Student right) {
return left.Equals(right);
}
Это не удастся, если значение null находится слева, но, скорее всего, не будет иметь нулевое значение справа.
Это довольно удаленный угол.
Форма оператора "if
", которая ставит константу слева, представляет собой сохранение из C/С++, где вы можете иметь произвольное выражение в выражении if.
Синтаксис С# для операторов if требует, чтобы выражение оценивалось в bool, что означает, что if (foo = 0)
не будет компилироваться.
if (null==myobject) {
- безопасный способ написания оператора if. Он исходит из C/С++, где условие является выражением, вычисленным для int
. Если результат равен нулю, что означает false
, все остальное - true
. Вы могли бы написать что-то вроде
if (variable == 1) {
но если вы не будете осторожны, вы также можете написать
if (variable = 1) {
в этом случае у вас есть задание, которое всегда оценивается как 1 и, следовательно, всегда верно.
Вы можете скомпилировать это и запустить его без проблем, но результат не будет тем, что вы ожидали. Поэтому программисты C/С++ начали писать такие вещи, как
if (1 == variable) {
Это не скомпилируется, если вы опечатаете его, поэтому вам всегда приходилось писать его, как вы хотели его написать. Это позже становится (хорошей) привычкой, и вы используете его на всех языках, с которыми вы работаете, например с С#.
Для тех, кто его пропустит, если вы хотите уменьшить беспорядок, также можно включить 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;
}
};
Как отмечают другие, они в основном эквивалентны.
Вы также должны посмотреть: http://en.wikipedia.org/wiki/Null_Object_pattern
Это очень полезная альтернатива просто проверке нулевой ссылки.