Swift tiene Optionals
. C # tiene Nullable
tipos.
Por lo que puedo decir, ambos sirven para el mismo propósito, además del valor de algún tipo, almacenan información si la variable tiene valor o no está definida (no inicializada).
Pregunta ¿son Optionals
sólo Nullable
tipos con diferente nombre o hay otras diferencias conceptuales?
En otras palabras, hablando del concepto en sí mismo, o en el contexto de lenguajes que no tienen Optionals
o Nullables
, ¿importa qué término se usa?
Al implementar esa funcionalidad en el idioma, ¿importa si nombre el tipo Optionals<T>
oNullable<T>
object-oriented
programming-languages
terminology
Dalija Prasnikar
fuente
fuente
Respuestas:
Hay una connotación diferente, a pesar de que funcionan de manera muy similar. Todos menos Microsoft (inserte aquí el rollo de ojo) usa
null
ynullable
solo en el contexto de referencias.Options
yMaybes
generalmente se entiende que se refieren tanto a referencias como a valores, especialmente en lenguajes de programación funcionales donde la transparencia referencial significa que no hay mucha diferencia entre un valor y una referencia.Options
es el término que causa la menor confusión entre una audiencia amplia. Solo los programadores de C # pensaránNullable
que a se aplica potencialmente a un tipo de valor, y creo que la mayoría de ellos son al menos conscientes de lo queOption
es un .fuente
En .NET, hay dos categorías de tipo: referencias y valores (int, double, structs, enums, etc.). Entre sus diferencias está el hecho de que una referencia puede ser
null
, mientras que un valor no puede. Por lo tanto, si tiene un tipo de valor y desea transmitir una semántica "opcional" o "desconocida", puede adornarlo conNullable<>
. Tenga en cuenta queNullable<>
está restringido por tipo para aceptar solo tipos de valor (tiene unawhere T : struct
cláusula).Nullable<>
también tiene ventajas especiales del compilador por las cuales unnull
valor está protegido deNullReferenceExceptions
:En lenguajes funcionales (como Scala, F #, Haskell, Swift, etc.) es común
null
que no exista . Esto se debe a que, en general, las personas consideran que la existencianull
es una mala idea , y los diseñadores de idiomas han decidido abordar este problema rechazándolo.Esto significa que nuevamente necesitamos alguna forma de representar un no valor en estos idiomas. Ingrese el
Option
tipo (la nomenclatura varía, se llamaMaybe
en Haskell). Esto hace un trabajo similar alNullable
envolver un tipo para agregar el caso donde el valor es "Ninguno" o "Desconocido", etc.La verdadera diferencia está en las funciones adicionales que le dan los idiomas que implementan
Option
. Como ejemplo, tomeOption.map
(en pseudocódigo):El encadenamiento de funciones
Option.map
es una forma poderosa de evitar la típica repetitiva de verificación nula que se ve en todas partes en C #:El equivalente anulable en C # sería:
Sin embargo, esto tiene una utilidad limitada en C # porque solo funcionará para los tipos de valor.
La nueva versión de C # ofrece el operador de "propagación nula" (
?.
), que es similar a laOption.map
función, excepto que solo es aplicable para métodos y accesores de propiedades. La muestra anterior sería reescritafuente
null
no es un valor válido para los tipos de F #.