Свифт имеет Optionals
. C # имеет Nullable
типы.
Насколько я могу судить, оба служат одной и той же цели, кроме значения некоторого типа, они хранят информацию о том, имеет ли переменная значение или не определена (неинициализирована).
Вопрос в том, Optionals
что это просто Nullable
типы с другим именем или есть другие концептуальные различия?
Другими словами, говорить о самом понятии, или в контексте языков, которые не имеют Optionals
или Nullables
имеет значение, какой термин используется?
При реализации этой функциональности на языке имеет значение, назову ли я тип Optionals<T>
илиNullable<T>
object-oriented
programming-languages
terminology
Далия Прасникар
источник
источник
Ответы:
Существует разная коннотация, хотя они работают очень схожим образом. Все, кроме Microsoft (вставьте здесь зрелище), используют
null
иnullable
только в контексте ссылок.Options
иMaybes
обычно понимается как относящийся к ссылкам и значениям, особенно в функциональных языках программирования, где прозрачность по ссылкам означает, что между значением и ссылкой нет большой разницы.Options
это термин, который вызывает наименьшее замешательство среди широкой аудитории. Только программисты на C # могут думать о том,Nullable
что они потенциально применимы к типу значения, и я думаю, что большинство из них, по крайней мере, знают, чтоOption
такое.источник
В .NET есть две категории типов: ссылки и значения (int, double, структуры, перечисления и т. Д.). Среди их отличий тот факт, что ссылка может быть
null
, а значение - нет. Таким образом, если у вас есть тип значения и вы хотите передать «необязательную» или «неизвестную» семантику, вы можете украсить егоNullable<>
. Обратите внимание, чтоNullable<>
тип ограничен для принятия только типов значений (в нем естьwhere T : struct
предложение).Nullable<>
также имеет специальные возможности от компилятора, благодаря чемуnull
значение защищено отNullReferenceExceptions
:В функциональных языках (например, Scala, F #, Haskell, Swift и т.д.) он является общим для ,
null
чтобы не существовало . Это происходит потому , что на общенародных считает существованиеnull
как плохая идея , и языковые дизайнеры решили решить эту проблему, запрещая его.Это означает, что нам снова нужен какой-то способ представления не значения в этих языках. Введите
Option
тип (номенклатура меняется, она называетсяMaybe
на Хаскеле). Это делает работу, аналогичнуюNullable
той, что обертывает тип, чтобы добавить регистр, в котором значение равно «Нет» или «Неизвестно» и т. Д.Реальная разница заключается в дополнительных функциях, предоставляемых вам языками, которые реализуют
Option
. В качестве примера возьмемOption.map
(в псевдокоде):Подобные функции цепочки
Option.map
- это мощный способ избежать типичного шаблона нулевой проверки, который вы видите повсюду в C #:Обнуляемый эквивалент в C # будет:
Однако это имеет ограниченную полезность в C #, потому что это будет работать только для типов значений.
Новая версия C # предлагает оператор «нулевого распространения» (
?.
), который похож наOption.map
функцию, за исключением того, что он применим только для методов и методов доступа к свойствам. Приведенный выше пример будет переписанисточник
null
не является допустимым значением для типов F #.