Это похмелье от языков, где значения неявно преобразуются в логический тип.
По большей части, все, что не является null
или не 0
, будет рассматриваться как true
, в противном случае оно было бы эквивалентно false
. Это означало, что любое присвоение константы всегда будет true
.
Здесь следует помнить, что функция присваивания возвращает назначенное значение , почти так же, как 5
является результатом 2+3
, myInt = 5
также возвращает 5
.
Из-за этого было рекомендовано проверить переменную против константы. Пример null
на самом деле, вероятно, в этом случае немного надуманный, поскольку в большинстве языков он будет возвращаться как ложный.
Как пример:
if(i = 1)
{
printf("Always out\n");
}
else
{
printf("Never prints\n");
}
i
присваивается значение 1
, которое затем возвращает значение присваивания, 1
, в оператор if
. Это эквивалентно true
, а условие if
соответствует.
Если бы вы попытались присвоить i
константе 1
, вы бы не скомпилировали, и поэтому было рекомендовано делать все в таком порядке (например, 1 == i
).
Это не обязательно в C #, и, в дополнение к вашему примеру, рекомендуется вызывать if(String.IsNullOrEmpty(myStringValue)) { //.... }
, так как строка имеет ... два ... значения по умолчанию с семантической точки зрения.