2012-06-21 5 views
9

В F # мантра, похоже, висцеральное избегание null, Nullable<T> и его ilk. Взамен мы должны использовать типы опций. Честно говоря, я действительно не вижу разницы.В чем разница между типом параметра и типом NULL?

  • Мое понимание F типа # опция является то, что она позволяет определить тип, который может содержать любой из его обычных значений, или None. Например, Option<int> позволяет использовать все значения, которые могут иметь int, в дополнение к None.

  • Мое понимание типов с нулевым значением C# заключается в том, что оно позволяет указать тип, который может содержать любые его нормальные значения, или null. Например, a Nullable<int> a.k.a int? допускает все значения, которые могут иметь int, кроме null.

В чем разница? Сделайте некоторую замену словаря Nullable и Option, null и None, и у вас в основном есть то же самое. Что все суета над null о?

+2

Речь идет об избежании логических ошибок как можно раньше - с 'option', вы получаете предупреждение/ошибку компилятора для отказа проверить' None'; с 'null' вы этого не делаете. – ildjarn

+0

Итак, теоретически, если был C# с совпадением шаблонов, который обеспечивал, чтобы вы обработали случай «null», это была бы стирка? –

+0

ИМО, в значительной степени, хотя другие будут спорить об ощущении _semantic_ 'null'. – ildjarn

ответ

16

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. Вы можете найти людей с обоими мнениями.

Вы также можете увидеть

Best explanation for languages without null

+0

В ответ на _why_ F # добавляет 'option <_>' стоит подчеркнуть, что 'Nullable' глубоко привязан к «null», который F # пытается удалить из рассмотрения. – Daniel

+0

@ Daniel, а также 'option' происходит от ML/OCaml, а F # - от OCaml-compat. Но да, по большей части, F # пытается отодвинуть нуль только в сценарии «.Net interop». – Brian

0

Ну, одно отличие состоит в том, что для Nullable<T> Т может быть только структурой, которая резко уменьшает случаи использования.

Также убедитесь, что этот ответ: https://stackoverflow.com/a/947869/288703

2

Преимущество использования option является то, что он делает явным, что переменная может содержать значения, в то время как обнуляемых типы оставить его неявным.Учитывая такое определение, как:

string val = GetValue(object arg); 

Система типа не документирует, может ли val быть null или что произойдет, если arg равно null. Это означает, что необходимо повторять проверки на границах функций для проверки допущений вызывающего и вызываемого лиц.

Наряду с сопоставлением с шаблоном, код с использованием типов параметров может быть статический проверено, чтобы гарантировать, оба случая обрабатывается, например, следующие результаты кода в предостережении:

let f (io: int option) = function 
| Some i -> i 
5

Поскольку каждая ссылка .NET типа может иметь это лишнее, бессмысленное значение - независимо от того, действительно ли оно - null, существует вероятность, и вы должны его проверить, а потому, что Nullable использует null как свое представление «ничего», я думаю, что имеет смысл устранить все это странность (что делает F #) и требует возможности «ничего» быть явным. Option<_> делает.

4

В чем разница?

F # позволяет выбрать, хотите ли вы ваш тип быть option типа и, когда вы делаете, призывает вас проверить None и делает наличие или отсутствие None явной в типе.

C# заставляет каждый ссылочный тип разрешить null и не рекомендует вам проверять наличие null.

Так что это просто разница в значениях по умолчанию.

Сделайте несколько заметок словаря с помощью Nullable и Option, null и None, и у вас в основном есть одно и то же. В чём вообще суета?

Как языки как SML, OCaml и Haskell показали, удаление null удаляет много ошибок во время выполнения от реального кода. В той степени, в которой оригинальный создатель null даже описывает его как «billion dollar mistake».

Смежные вопросы