Блог переехал. Актуальная версия поста находится по адресу: http://aakinshin.net/ru/blog/dotnet/cheatsheet-nullable/.
Что будет, если null поделить на ноль? А сколько будет null | true? А null & true? А ((string)null + null)?
Практика подсказывает, что C#-разработчики зачастую не особо задумываются о том, как будут оцениваться выражения, если один из операндов равен null. Поэтому я решил составить небольшую шпаргалку на эту тему.
Числа
Обычные арифметические операции с числами, в которых один из операндов равен null, всегда будут возвращать null. Т.е. если у нас имеется некоторый X типа sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double или decimal, то для любых значений X работает нижеприведённая табличка. Даже если X==0, то выражения null / X и null % X всё равно вернут null.
+------------+-------+ | Expression | Value | +------------+-------+ | X + null | null | | X - null | null | | X * null | null | | X / null | null | | X % null | null | | null + X | null | | null - X | null | | null * X | null | | null / X | null | | null % X | null | +------------+-------+
Сравнения
Операции <, <=, >, >= всегда возвращают false, если один из операндов равен null. Операции == и != работают так, как подсказывает логика.
+-------+-------+-------+-------+-------+-------+-------+-------+ | X | Y | X<Y | X<=Y | X>Y | X>=Y | X==Y | X!=Y | +-------+-------+-------+-------+-------+-------+-------+-------+ | 0 | 0 | false | true | false | true | true | false | | 0 | null | false | false | false | false | false | true | | null | 0 | false | false | false | false | false | true | | null | null | false | false | false | false | true | false | +-------+-------+-------+-------+-------+-------+-------+-------+
Логические операции
Логические операции |, &, ^ вызывают большее количество непонимания у людей. Проиллюстрируем булеву арифметику ещё одной табличной:
+-------+-------+-------+-------+-------+ | X | Y | X | Y | X & Y | X ^ Y | +-------+-------+-------+-------+-------+ | false | false | false | false | false | | false | true | true | false | true | | false | null | null | false | null | | true | false | true | false | true | | true | true | true | true | false | | true | null | true | null | null | | null | false | null | false | null | | null | true | true | null | null | | null | null | null | null | null | +-------+-------+-------+-------+-------+
Строки
В операциях конкатенации строк null всегда заменяется на пустую строчку. Таким образом,
"foo" + null == "foo" (string)null + null + null == ""
Ссылки по теме
- C# Language Specification
- 4.1.10 Nullable types
- 6.1.4 Implicit nullable conversions
- 6.2.3 Explicit nullable conversions
- 7.3.7 Lifted operators
- 7.8.4 Addition operator
- 7.10.9 Equality operators and null
- 7.11.4 Nullable boolean logical operators
- MSDN: Using Nullable Types (C# Programming Guide)
Комментариев нет:
Отправить комментарий