Swift ma Optionals
. C # ma Nullable
typy.
O ile mogę stwierdzić, oba służą temu samemu celowi, oprócz wartości pewnego rodzaju przechowują informacje, czy zmienna ma wartość, czy jest niezdefiniowana (niezainicjowana).
Pytanie brzmi, czy są Optionals
tylko Nullable
typy o różnych nazwach, czy istnieją inne różnice pojęciowe?
Innymi słowy, mówiąc o samym pojęciu, lub w kontekście języków, które nie mają Optionals
lub Nullables
, czy ma to znaczenie, używa się tego terminu?
Wdrażając tę funkcjonalność w języku, nie ma znaczenia, czy podam typ, Optionals<T>
czy teżNullable<T>
object-oriented
programming-languages
terminology
Dalija Prasnikar
źródło
źródło
Odpowiedzi:
Istnieje inna konotacja, mimo że działają one bardzo podobnie. Wszyscy oprócz Microsoftu (wstaw tutaj rzut oka) używa
null
inullable
tylko w kontekście referencji.Options
iMaybes
są ogólnie rozumiane jako odnoszące się zarówno do referencji, jak i wartości, szczególnie w funkcjonalnych językach programowania, w których przejrzystość referencyjna oznacza, że nie ma dużej różnicy między wartością a referencją.Options
jest terminem, który powoduje najmniej zamieszania wśród szerokiego grona odbiorców. Tylko programiści C # będą myśleć oNullable
potencjalnym zastosowaniu do typu wartości i myślę, że większość z nich jest przynajmniej świadoma tego, czymOption
jest.źródło
W .NET istnieją dwie kategorie typów: odwołania i wartości (int, double, structs, enums itp.). Wśród ich różnic jest fakt, że referencja może być
null
, podczas gdy wartość nie. Zatem jeśli masz typ wartości i chcesz przekazać „opcjonalną” lub „nieznaną” semantykę, możesz ją ozdobićNullable<>
. Zauważ, żeNullable<>
jest ograniczony przez typ, aby akceptować tylko typy wartości (mawhere T : struct
klauzulę).Nullable<>
ma również specjalne afordancje od kompilatora, dzięki którymnull
wartość jest chroniona przedNullReferenceExceptions
:W językach funkcjonalnych (takich jak Scala, F #, Haskell, Swift itp) to jest wspólne dla
null
celu nie istnieje . Jest tak, ponieważ ogólnie ludzie uważają istnienie tegonull
za zły pomysł , a projektanci języków postanowili rozwiązać ten problem, nie pozwalając mu na to.Oznacza to, że ponownie potrzebujemy jakiegoś sposobu przedstawienia nie-wartości w tych językach. Wpisz
Option
typ (nomenklatura jest różna, nazywa sięMaybe
w Haskell). Wykonuje to podobne zadanieNullable
, ponieważ otacza typ, aby dodać przypadek, w którym wartość to „Brak” lub „Nieznany” itp.Prawdziwa różnica polega na tym, że dodatkowe funkcje są dostępne w implementowanych językach
Option
. Jako przykład weźOption.map
(w pseudokodzie):Łańcuchowe funkcje, takie jak,
Option.map
to potężny sposób na uniknięcie typowej płyty kontrolnej zerowania, którą widzisz wszędzie w C #:Nullable równoważne w C # byłoby:
Jednak ma to ograniczoną użyteczność w języku C #, ponieważ będzie działać tylko dla typów wartości.
Nowa wersja C # oferuje operator „zerowej propagacji” (
?.
), który jest podobny doOption.map
funkcji, z tą różnicą, że ma zastosowanie tylko do metod i akcesorów właściwości. Powyższa próbka zostanie przepisanaźródło
null
nie jest prawidłową wartością dla typów F #.