Swift tem Optionals
. C # tem Nullable
tipos.
Tanto quanto posso dizer, ambos servem ao mesmo propósito, além de algum tipo de valor, eles armazenam informações se a variável tem valor ou é indefinida (não inicializada).
A pergunta é: são Optionals
apenas Nullable
tipos com nome diferente ou existem outras diferenças conceituais?
Em outras palavras, falar sobre o próprio conceito, ou no contexto de linguagens que não possuem Optionals
ou Nullables
, importa qual termo é usado?
Ao implementar essa funcionalidade na linguagem, importa se eu cito o tipo Optionals<T>
ouNullable<T>
object-oriented
programming-languages
terminology
Dalija Prasnikar
fonte
fonte
Respostas:
Existe uma conotação diferente, mesmo que eles funcionem de maneira muito semelhante. Todo mundo, exceto a Microsoft (insira o olho aqui) usa
null
enullable
somente no contexto de referências.Options
eMaybes
geralmente são entendidos como referências e valores, especialmente em linguagens de programação funcionais em que transparência referencial significa que não há muita diferença entre um valor e uma referência.Options
é o termo que causa a menor confusão entre um público amplo. Somente os programadores de C # pensam em aNullable
como potencialmente aplicável a um tipo de valor, e acho que a maioria deles tem pelo menos consciência do queOption
é.fonte
No .NET, existem duas categorias de tipo: referências e valores (int, double, structs, enumerações etc.). Entre suas diferenças está o fato de que uma referência pode ser
null
, enquanto um valor não pode. Portanto, se você tem um tipo de valor e deseja transmitir semântica "opcional" ou "desconhecida", é possível adorná-loNullable<>
. Observe queNullable<>
é restrito por tipo para aceitar apenas tipos de valor (possui umawhere T : struct
cláusula).Nullable<>
também possui recursos especiais do compilador, pelo qual umnull
valor é protegido contraNullReferenceExceptions
:Em linguagens funcionais (tais como Scala, F #, Haskell, Swift etc), é comum que
null
a não existir . Isso ocorre porque, em geral, as pessoas consideram a existência denull
uma má idéia e os designers de linguagem decidiram resolver esse problema, impedindo-o.Isso significa que, novamente, precisamos de alguma maneira de representar um não valor nesses idiomas. Digite o
Option
tipo (a nomenclatura varia, é chamadaMaybe
em Haskell). Isso faz um trabalho semelhante aoNullable
que envolve um tipo para adicionar o caso em que o valor é "Nenhum" ou "Desconhecido" etc.A diferença real está nas funções extras dadas a você pelas linguagens implementadas
Option
. Como exemplo, considereOption.map
(em pseudocódigo):Funções de encadeamento como
Option.map
é uma maneira poderosa de evitar o típico clichê de verificação nula que você vê em qualquer lugar do C #:O equivalente anulável em C # seria:
No entanto, isso tem utilidade limitada em C # porque funcionará apenas para tipos de valor.
A nova versão do C # oferece o operador "propagação nula" (
?.
) que é semelhante àOption.map
função, exceto que é aplicável apenas a métodos e acessadores de propriedades. A amostra acima seria reescritafonte
null
não é um valor válido para tipos de F #.