В чем разница между типом 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 (за исключением совершенно необходимым для взаимодействия) и сосредоточиться на чистых растворов с Options. Вы можете найти людей с обоими мнениями.

вы также можете посмотреть

лучшее объяснение для языков без null


потому что каждый ссылочный тип .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