Swift hat Optionals
. C # hat Nullable
Typen.
Soweit ich weiß, dienen beide demselben Zweck und speichern neben dem Wert eines bestimmten Typs auch Informationen darüber, ob eine Variable einen Wert hat oder nicht definiert (nicht initialisiert) ist.
Die Frage ist, ob es sich Optionals
nur um Nullable
Typen mit unterschiedlichen Namen handelt oder ob es andere konzeptionelle Unterschiede gibt.
Mit anderen Worten, wenn Sie über das Konzept selbst sprechen oder im Kontext von Sprachen, die nicht über Optionals
oder verfügen Nullables
, spielt es eine Rolle, welcher Begriff verwendet wird?
Bei der Implementierung dieser Funktionalität in Sprache spielt es eine Rolle, ob ich type Optionals<T>
oder bezeichneNullable<T>
object-oriented
programming-languages
terminology
Dalija Prasnikar
quelle
quelle
Antworten:
Es gibt eine andere Konnotation, obwohl sie sehr ähnlich funktionieren. Jeder außer Microsoft (hier Eye-Roll einfügen) nutzt
null
undnullable
nur im Rahmen von Referenzen.Options
undMaybes
es wird allgemein verstanden, dass sie sich sowohl auf Referenzen als auch auf Werte beziehen, insbesondere in funktionalen Programmiersprachen, in denen referenzielle Transparenz bedeutet, dass es keinen großen Unterschied zwischen einem Wert und einer Referenz gibt.Options
ist der Begriff, der bei einem breiten Publikum am wenigsten Verwirrung stiftet. Nur C # -Programmierer werden sich einenNullable
als potenziell auf einen Werttyp zutreffend vorstellen, und ich denke, die meisten von ihnen sind sich zumindest dessen bewusst, was ein WertOption
ist.quelle
In .NET gibt es zwei Kategorien von Typen: Referenzen und Werte (int, double, structs, enums usw.). Zu ihren Unterschieden gehört die Tatsache, dass eine Referenz sein kann
null
, während ein Wert dies nicht kann. Wenn Sie also einen Wertetyp haben und "optionale" oder "unbekannte" Semantik übermitteln möchten, können Sie ihn mit schmückenNullable<>
. Beachten Sie, dassNullable<>
typabhängig nur Werttypen zulässig sind (es gibt einewhere T : struct
Klausel).Nullable<>
hat auch spezielle Vergünstigungen vom Compiler, wodurch einnull
Wert geschützt ist vorNullReferenceExceptions
:In funktionalen Sprachen (wie Scala, F #, Haskell, Swift usw.) ist es üblich, dass
null
sie nicht existieren . Dies liegt daran, dass die Existenz von im Großen und Ganzennull
als eine schlechte Idee angesehen wird und die Sprachdesigner beschlossen haben, dieses Problem zu lösen, indem sie es nicht zulassen.Dies bedeutet, dass wir in diesen Sprachen wieder eine Möglichkeit benötigen, einen Nicht-Wert darzustellen . Geben Sie den
Option
Typ ein (die Nomenklatur variiert,Maybe
in Haskell heißt sie). Dies ist insofern ähnlichNullable
, als es einen Typ umschließt, um den Fall hinzuzufügen, in dem der Wert "Keine" oder "Unbekannt" usw. ist.Der wahre Unterschied liegt in den zusätzlichen Funktionen, die Ihnen von den implementierten Sprachen zur Verfügung gestellt werden
Option
. Nehmen Sie als BeispielOption.map
(in Pseudocode):Verkettungsfunktionen wie
Option.map
sind eine leistungsstarke Methode, um das typische Null-Check-Boilerplate zu vermeiden, das Sie überall in C # sehen:Das Nullable-Äquivalent in C # wäre:
Dies ist jedoch in C # nur eingeschränkt nützlich, da es nur für Werttypen funktioniert.
Die neue Version von C # bietet den Operator "Null-Propagation" (
?.
), der derOption.map
Funktion ähnlich ist, außer dass er nur für Methoden und Eigenschafts-Accessoren gilt. Das obige Beispiel würde neu geschriebenquelle
null
ist kein gültiger Wert für F # -Typen.