В чем разница между типом option и типом nullable?
в F# мантре, кажется, есть внутреннее избегание null
, Nullable<T>
и тому подобное. Взамен мы должны вместо этого использовать типы опций. Честно говоря, я не вижу разницы.
мое понимание типа опции F# заключается в том, что он позволяет указать тип, который может содержать любое из его нормальных значений, или
None
. Например,Option<int>
позволяет все значения, которыеint
может быть, в дополнение кNone
.мое понимание типов C# nullable заключается в том, что он позволяет указать тип, который может содержать любое из его нормальных значений, или
null
. Например,Nullable<int>
a.к. аint?
позволяет все значения, которыеint
может быть, в дополнение кnull
.
в чем разница? Сделайте некоторую замену словаря с Nullable
и Option
, null
и None
, и у вас в основном есть то же самое. Что все возня за null
о?
5 ответов
параметры F# являются общими, вы можете создать Option<'T>
для любого типа 'T
.
Nullable<T>
- ужасно странный тип; вы можете применять его только к структурам, и хотя Nullable
тип сам по себе является структурой, он не может быть применен к себе. Поэтому вы не можете создать Nullable<Nullable<int>>
, тогда как вы можете создать Option<Option<int>>
. Они должны были сделать некоторые рамки магии, чтобы сделать эту работу для Nullable
. В любом случае это означает, что для Nullables вы должны знать априори, является ли тип классом или структурой, и если это класс, вам нужно просто использовать null, а не Nullable. Это уродливая дырявая абстракция; это основное значение, похоже, с взаимодействием с базой данных, поскольку я предполагаю, что обычно имеют объекты "int или no value" для работы в доменах базы данных.
Im мое мнение, .Net framework - это просто уродливый беспорядок, когда дело доходит до null и Nullable
. Вы можете утверждать, что F# "добавляет беспорядок", имея Option
, или что он спасает вас от беспорядка, предполагая, что вы не просто null/Nullable
(за исключением совершенно необходимым для взаимодействия) и сосредоточиться на чистых растворов с Option
s. Вы можете найти людей с обоими мнениями.
вы также можете посмотреть
потому что каждый ссылочный тип .NET может иметь это дополнительное, бессмысленное значение-будь то is null, возможность существует, и вы должны проверить ее-и потому что Nullable
использует null
как его представление "ничего", я думаю, что имеет смысл устранить всю эту странность (что делает F#) и требует, чтобы возможность" ничего " была явной. Option<_>
это.
в чем разница?
F# позволяет выбрать, хотите ли вы, чтобы ваш тип был option
введите и, когда вы это сделаете, призывает вас проверить None
и делает наличие или отсутствие None
явного типа.
C# заставляет каждый ссылочный тип разрешить null
и не поощряет вас проверять на null
.
таким образом, это просто разница по умолчанию.
у некоторых словарный запас замена на Nullable и Option, null и None, и у вас в основном есть то же самое. Из-за чего весь сыр-бор из-за нуля?
как показали такие языки, как SML, OCaml и Haskell, удаление null
удаляет много ошибок во время выполнения из реального кода. В той мере, в какой первоначальный создатель null
даже описывает его как его " ошибка в миллиард долларов".
преимущества использования option
заключается в том, что он делает явным, что переменная не может содержать значения, тогда как типы nullable оставляют ее неявной. Дано такое определение, как:
string val = GetValue(object arg);
система типов не документирует, может ли val когда-либо быть null, или что произойдет, если arg равно null. Это означает, что повторяющиеся проверки должны быть сделаны на границах функций для проверки предположений вызывающего абонента и вызываемого абонента.
наряду с сопоставлением шаблонов, код с использованием типов опций можно статически проверить, чтобы убедиться, что оба случая обрабатываются, например, следующий код приводит к предупреждению:
let f (io: int option) = function
| Some i -> i
Ну, одно отличие заключается в том, что на Nullable<T>
, T может быть только структурой, которая значительно уменьшает случаи использования.
также обязательно прочитайте этот ответ:https://stackoverflow.com/a/947869/288703