Swift l'a fait Optionals
. C # a des Nullable
types.
Pour autant que je sache, les deux ont le même objectif, outre la valeur d'un certain type, ils stockent des informations sur la variable ou non (non initialisée).
La question est Optionals
juste des Nullable
types avec un nom différent ou y a-t-il d'autres différences conceptuelles?
En d'autres termes, parler du concept lui-même, ou dans le contexte de langues qui n'ont pas Optionals
ou Nullables
, quel est le terme utilisé?
Lors de la mise en œuvre de cette fonctionnalité dans la langue, importe-t-il que je nomme le type Optionals<T>
ouNullable<T>
object-oriented
programming-languages
terminology
Dalija Prasnikar
la source
la source
Réponses:
Il y a une connotation différente, même si elles fonctionnent de manière très similaire. Tout le monde sauf Microsoft (insérez le œil ici) utilise
null
etnullable
uniquement dans le contexte des références.Options
etMaybes
sont généralement compris comme faisant référence à la fois aux références et aux valeurs, en particulier dans les langages de programmation fonctionnels où la transparence référentielle signifie qu'il n'y a pas beaucoup de différence entre une valeur et une référence.Options
est le terme qui provoque le moins de confusion parmi un large public. Seuls les programmeurs C # considéreront unNullable
comme potentiellement applicable à un type de valeur, et je pense que la plupart d'entre eux sont au moins conscients de ce qu'est unOption
.la source
Dans .NET, il existe deux catégories de types: les références et les valeurs (int, double, structs, enums, etc.). Parmi leurs différences, il y a le fait qu'une référence peut être
null
, alors qu'une valeur ne peut pas. Ainsi, si vous avez un type de valeur et que vous souhaitez transmettre une sémantique "facultative" ou "inconnue", vous pouvez l'orner avecNullable<>
. Notez qu'ilNullable<>
est contraint par type à n'accepter que les types de valeur (il a unewhere T : struct
clause).Nullable<>
a également des avantages spéciaux du compilateur grâce auxquels unenull
valeur est protégée contreNullReferenceExceptions
:Dans les langages fonctionnels (comme Scala, F #, Haskell, Swift, etc.), il est courant
null
de ne pas exister . En effet, dans l'ensemble, les gens considèrent l'existence denull
comme une mauvaise idée , et les concepteurs de langage ont décidé de résoudre ce problème en le refusant.Cela signifie que nous avons encore besoin d'un moyen de représenter une non-valeur dans ces langues. Entrez le
Option
type (la nomenclature varie, cela s'appelleMaybe
en Haskell). Cela fait un travail similaire àNullable
en ce qu'il encapsule un type pour ajouter le cas où la valeur est "Aucun" ou "Inconnu" etc.La vraie différence réside dans les fonctions supplémentaires qui vous sont offertes par les langages qui implémentent
Option
. À titre d'exemple, prenezOption.map
(en pseudocode):Le chaînage de fonctions comme
Option.map
est un moyen puissant d'éviter le passe-partout de vérification nulle typique que vous voyez partout en C #:L'équivalent nul en C # serait:
Cependant, cela a une utilité limitée en C # car cela ne fonctionnera que pour les types de valeur.
La nouvelle version de C # propose l'opérateur "propagation nulle" (
?.
) qui est similaire à laOption.map
fonction sauf qu'il n'est applicable qu'aux méthodes et aux accesseurs de propriété. L'échantillon ci-dessus serait réécritla source
null
n'est pas une valeur valide pour les types F #.