С# вам нужно проверить, имеет ли что-то значение, и если что-то больше 0?

Работа над проектом и кодер делает это много в его проверках. Сначала он проверяет, имеет ли значение nullable значение int, а затем он проверяет, превышает ли его значение 0. Почему? Зачем делать две проверки, если одна проверка - если она больше 0 - должна быть достаточной? Потому что nulls не больше 0, поэтому... Это избыточно?

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

Ответы

Ответ 1

Код, вероятно, избыточен.

Если я int?, то:

if (i.HasValue && i.Value > 0)

эквивалентно:

if (i > 0)

От MSDN:

Когда вы выполняете сравнения с типами NULL, если значение одного из нулевых типов является нулевым, а другое - нет, все сравнения оцениваются как false, за исключением: = (не равно). Важно не предполагать, что, поскольку конкретное сравнение возвращает false, противоположный случай возвращает true. В следующем примере 10 не больше, меньше или равно нулю. Только num1!= Num2 имеет значение true.

Ответ 2

Возможно, что значение переменной имеет разные значения в этом контексте.

int? someNumber = null; //might mean "there is no value"
int? someOtherNumber = 0; //might mean "the user has selected: 0"

Ответ 3

Следующее:

class Program {
    static void Main(string[] args) {
        int? i = null;
        if (i > 0) { Console.WriteLine(">0");
        } else {     Console.WriteLine("not >0");
        }
        if (i < 0) { Console.WriteLine("<0");
        } else {     Console.WriteLine("not <0");
        }
        if (i == 0) {Console.WriteLine("==0");
        } else {     Console.WriteLine("not ==0");
        }
        Console.ReadKey();
    }
}

выводит

not >0
not <0
not ==0

без исключения. Таким образом, проверка null/HasValue в этом случае является избыточной. Есть одна небольшая разница. Следующее:

(i.HasValue && (i.Value == 0))

примерно в два раза быстрее, чем

(i == 0)

когда я является нулевым, хотя оба они настолько быстра, что это не важная разница. Когда я имеет значение, два сравнения занимают примерно такое же количество времени.

Ответ 4

Проверка нулей обычно выполняется для предотвращения исключений или для установки значений по умолчанию (до .NET 4). Проверка нуля была бы скорее выбором бизнес-логики, в зависимости от обстоятельств.

Ответ 5

Вы можете обнаружить, что программист используется для следующего типа проверки ссылочных типов до их разыменования. Учитывая, что Nullable HasValue похож по понятию на нулевую проверку, я думаю, что шаблон "застрял", хотя он избыточен с типами с возможностью NULL.

if ((myObject != null)  && (myObject.SomeValue > 0))

...