Die null
ist leider die Quelle vieler Laufzeitfehler.
Die null
-en befüllen die Code-Basis und machen sie weniger gut lesbar und wartbar.
Ein typisches Codefragment in C#:
1: 2: 3: 4: 5: 6: 7: 8: 9: |
// C# if (x != null) { return UseALanguageWithoutNull( x ); } else { return null; } |
Wie es ohne null aussieht
1: 2: |
// F# UseALanguageWithoutNull x |
Null vs. Option.None?
Wir wissen dass in F# alle Werte initialisiert sind und niemals mit null
. Mit der Ausnahme, dass von einer .Net Komponente die nicht in F# geschrieben ist, ein Rückgabewert oder ein Out Parameter als null
daherkommt.
Was ist nun, wenn man den Zustand von nicht vorhanden in F# abbilden will?
Dazu dient der Option
Type. Dieser kann None
oder Some 'T
sein. Wobei ‘T ein beliebiger Type sein kann, also z.B. ein int
, ein String
oder ein Array
.
Jetzt könnte man ja sagen es ist genau das selbe?
1: 2: |
null vs. None obj vs. Some 'T |
Die Unterschiede sind:
- Es ist nicht umständlicher einen Wert in einen Option type zu packen. Auch wenn es im ersten Augenblick so aussehen mag. Der Nutzen überwiegt!
- Der Type ‘T von
Some
ist bekannt, und auch vonNone
, also welcher Type der keinen Wert hat. Dies ermöglicht die exakte statische Type Überprüfung durch den Compiler, was zu sicherem Code führt. Es wird also nicht zur Laufzeit implizit ge-castet. - Elimination der Mehrfachbedeutung von
null
. Wie oben schon erwähnt: Bedeutet null nun, nicht initialisiert oder nicht zugewiesen oder nicht vorhanden oder kein Ergebnis oder Fehler ? Da jede Variable auchnull
sein kann, muss der Programmierer immer mitdenken, was für Zustände die Variable haben könnte und was diese im Kontext nun bedeutet. Vergisst er es oder missinterpretiert er es, hilft ihm der Compiler nicht, erst zur Laufzeit unter bestimmten Bedingungen (Zustände, Daten) kann es dann zunull
-Exceptions kommen. Im Gegensatz dazu, mit demOption
Type ist es absolut klar und der Compiler weiss es auch und hilft!
Full name: Microsoft.FSharp.Core.obj