Почему повторная установка null
не рекомендуется?Идея состоит в том, что если тип возвращаемого значения функции T
, вы всегда получаете один объект типа T
, в то время как null
равен определенно не что-то типа T
, даже ноль объектов типаT
.
В случае getCustomers()
вы получаете List<Customer>
, что составляет от 0 до n Customer
объектов.
В случае getCustomer()
вы быкак 0 или 1 Customer
объектов.В Haskell вы получаете ADT и Maybe
для этого, в Scala у вас есть case-классы и Option
.Что вы можете использовать в C #?Ну, есть Возможно реализация в C # , внутри это действительно просто.
С Maybe<Customer> getCustomer()
вы гарантированно не передадите его результат как нулевое значение вместо Customer
.Вы явно предупреждены: вы можете либо получить клиента, либо не получить клиента.
Почему Maybe
работает лучше, чем null
?Это потому, что Maybe
- это монада со звуковым математическим основанием, а null
- нет.List
- это тоже монада, это делает его таким удобным.При правильном подходе монады можно комбинировать приятными способами , чтобы вам не приходилось проверять HasValue
везде.С null
вы застряли с вложенными if
s в стиле C для каждого результата функции.
Исключения также являются монадой!Вот почему другие ответы (правильно) предлагают бросить исключение.За исключением, вы даже получаете еще одну приятную вещь, типичную для функционального программирования, а именно сопоставление с образцом (в предложениях catch
).