coalescência nula se traduz aproximadamente em return x, unless it is null, in which case return y
Eu frequentemente preciso return null if x is null, otherwise return x.y
Eu posso usar return x == null ? null : x.y;
Não é ruim, mas isso null
no meio sempre me incomoda - parece supérfluo. Eu prefiro algo como return x :: x.y;
, onde o que vem depois de ::
é avaliado apenas se o que vem antes não é null
.
Eu vejo isso como quase o oposto da coalescência nula, meio que misturada com uma verificação nula em linha e concisa, mas estou [ quase ] certo de que não existe tal operador em C #.
Existem outras linguagens que possuem esse operador? Se sim, como é chamado?
(Eu sei que posso escrever um método para ele em C #; eu uso return NullOrValue.of(x, () => x.y);
, mas se você tiver algo melhor, gostaria de ver isso também.)
return x ? x.y : NULL
. Oba por converter tipos de ponteiro em booleanos!Respostas:
Existe o operador de desreferenciação null-safe (?.) No Groovy ... Acho que é isso que você quer.
(Também é chamado de operador de navegação segura .)
Por exemplo:
Isso dará nulo se
person
,person.homeAddress
ouperson.homeAddress.postcode
for nulo.(Isso agora está disponível em C # 6.0, mas não em versões anteriores)
fonte
null
, por exemplo:def bar = foo ?: "<null>"
Decimal? post = pre == null ? null : SomeMethod( pre );
. Seria bom se eu pudesse reduzi-lo para "Decimal? Post = pre :: SomeMethod (pre);"Nós consideramos adicionar?. para C # 4. Não fez o corte; é um recurso "bom ter", não um recurso "preciso ter". Vamos considerá-lo novamente para hipotéticas versões futuras do idioma, mas eu não prenderia a respiração esperando se fosse você. Não é provável que se torne mais crucial com o passar do tempo. :-)
fonte
Se você tiver um tipo especial de lógica booleana de curto-circuito, poderá fazer isso (exemplo de javascript):
Se
x
for nulo, não será avaliadox.y
.fonte
Parecia certo adicionar isso como uma resposta.
Eu acho que a razão pela qual não existe tal coisa em C # é porque, ao contrário do operador de coalescência (que é válido apenas para tipos de referência), a operação reversa pode render uma referência ou um tipo de valor (ou seja,
class x
com membroint y
- portanto, infelizmente seria inutilizável em muitas situações.Não estou dizendo, porém, que não gostaria de ver isso!
Uma solução potencial para esse problema seria o operador elevar automaticamente uma expressão de tipo de valor no lado direito para um valor anulável. Mas então você tem o problema de que
x.y
onde y é um int, na verdade retornará umint?
que seria uma dor.Outra solução, provavelmente melhor, seria o operador retornar o valor padrão (ou seja, nulo ou zero) para o tipo do lado direito se a expressão à esquerda for nula. Mas então você tem problemas para distinguir cenários onde um zero / nulo foi realmente lido
x.y
ou se foi fornecido pelo operador de acesso seguro.fonte
int?
como valor de retorno padrão e o usuário pode alterá-lo para um int, se desejar. Por exemplo, se eu gostaria de chamar algum métodoLookup
com um valor padrão de -1 no caso de uma das minhas referências sernull
:foo?.Bar?.Lookup(baz) ?? -1
?. :
ser um operador ternário, onde o lado direito deve ser do mesmo tipo que o membro apropriado dado no meio?O Delphi tem o operador: (em vez de.), Que é seguro para nulos.
Eles estavam pensando em adicionar um?. operador para C # 4.0 para fazer o mesmo, mas isso pegou o bloco de corte.
Nesse ínterim, há IfNotNull () que tipo de coça essa coceira. Certamente é maior do que?. ou:, mas permite que você componha uma cadeia de operações que não exigirá uma NullReferenceException para você se um dos membros for nulo.
fonte
?.
é um recurso da linguagem C # 6.0 e, sim, faz exatamente o que o OP pediu aqui. Melhor tarde do que nunca ^^Em Haskell, você pode usar o
>>
operador:Nothing >> Nothing
éNothing
Nothing >> Just 1
éNothing
Just 2 >> Nothing
éNothing
Just 2 >> Just 1
éJust 1
fonte
Haskell tem
fmap
, que neste caso eu acho que é equivalente aData.Maybe.map
. Haskell é puramente funcional, então o que você está procurando seriaSe
x
forNothing
, isso retornaNothing
. Sex
forJust object
, isso retornaJust (select_y object)
. Não é tão bonito quanto a notação de ponto, mas por ser uma linguagem funcional, os estilos são diferentes.fonte
O PowerShell permite que você faça referência a propriedades (mas não a métodos de chamada) em uma referência nula e retornará nulo se a instância for nula. Você pode fazer isso em qualquer profundidade. Eu esperava que o recurso dinâmico do C # 4 fosse compatível com isso, mas não é.
Não é bonito, mas você pode adicionar um método de extensão que funcione da maneira que você descreve.
fonte
Freqüentemente preciso desta lógica para strings:
fonte
Crie uma instância estática de sua classe em algum lugar com todos os valores padrão corretos para os membros.
Por exemplo:
então em vez de seu
você pode escrever
fonte
Isso está sendo adicionado no C # vNext (Roslyn desenvolvido com C #, lançamentos com Visual Studio 2014).
É chamado de propagação nula e é listado aqui como completo. https://roslyn.codeplex.com/wikipage?title=Language%20Feature%20Status
Também está listado aqui como completo: https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3990187-add-operator-to-c
fonte
O chamado "operador nulo-condicional" foi introduzido no C # 6.0 e no Visual Basic 14.
Em muitas situações, ele pode ser usado como o oposto exato do operador nulo-coalescente:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators
fonte