Eu sei que a maneira padrão de usar o operador coalescente nulo em C # é definir valores padrão.
string nobody = null;
string somebody = "Bob Saget";
string anybody = "";
anybody = nobody ?? "Mr. T"; // returns Mr. T
anybody = somebody ?? "Mr. T"; // returns "Bob Saget"
Mas o que mais pode ??
ser usado? Não parece tão útil quanto o operador ternário, além de ser mais conciso e fácil de ler do que:
nobody = null;
anybody = nobody == null ? "Bob Saget" : nobody; // returns Bob Saget
Portanto, dado que menos sabem sobre o operador coalescente nulo ...
Você já usou
??
para outra coisa?É
??
necessário ou você deve apenas usar o operador ternário (com o qual a maioria está familiarizada)
c#
coding-style
null
conditional-operator
null-coalescing-operator
Armstrongest
fonte
fonte
Eu usei-o como uma linha de carga lenta:
Legível? Decida por si mesmo.
fonte
Eu achei útil de duas maneiras "um pouco estranhas":
out
parâmetro ao escreverTryParse
rotinas (ou seja, retornar o valor nulo se a análise falhar)Este último precisa de um pouco mais de informação. Normalmente, quando você cria uma comparação com vários elementos, é necessário verificar se a primeira parte da comparação (por exemplo, idade) fornece uma resposta definitiva e a próxima parte (por exemplo, nome) apenas se a primeira parte não ajudar. Usar o operador coalescente nulo significa que você pode escrever comparações bastante simples (seja para pedidos ou igualdade). Por exemplo, usando algumas classes auxiliares no MiscUtil :
É certo que agora tenho o ProjectionComparer no MiscUtil, junto com algumas extensões, que tornam esse tipo de coisa ainda mais fácil - mas ainda é legal.
O mesmo pode ser feito para verificar a igualdade de referência (ou a nulidade) no início da implementação de Equals.
fonte
Outra vantagem é que o operador ternário exige uma avaliação dupla ou uma variável temporária.
Considere isso, por exemplo:
enquanto no operador ternário, você fica com:
que chama MyMethod duas vezes ou:
De qualquer maneira, o operador coalescente nulo é mais limpo e, acho, mais eficiente.
fonte
MyMethod()
tem algum tipo de efeitos colaterais.MyMethod()
não tiver nenhum efeito fora do retorno de um valor, o compilador sabe que não deve chamá-lo duas vezes, então você realmente não precisa se preocupar com eficiência aqui na maioria dos casos.MyMethod()
há uma sequência encadeada de objetos pontilhados. Ex:myObject.getThing().getSecondThing().getThirdThing()
MyMethod
são idênticas nesse contexto, assumindo queMyMethod
é uma função pura. Outra opção é a memorização automática ou apenas ter a função fechada no cache. Por outro lado: en.wikipedia.org/wiki/Global_value_numberingOutra coisa a considerar é que o operador de coalescência não chama o método get de uma propriedade duas vezes, como o ternário.
Portanto, existem cenários em que você não deve usar ternários, por exemplo:
Se você usar:
o getter será chamado duas vezes e a
count
variável será igual a 2, e se você usar:a
count
variável será igual a 1, como deveria.fonte
??
é equivalente a?:
.A maior vantagem que encontro para o
??
operador é que você pode converter facilmente tipos de valor anuláveis em tipos não anuláveis:Eu freqüentemente uso isso em consultas Linq:
fonte
kvp == null
. E na verdadeNullable<T>
tem umGetValueOrDefault
método que eu normalmente uso.Eu usei ?? na minha implementação do IDataErrorInfo:
Se alguma propriedade individual estiver no estado "erro", eu recebo esse erro, caso contrário, fico nulo. Funciona muito bem.
fonte
this["Name"]
,this["Address"]
, etc ??Você pode usar o operador coalescente nulo para torná-lo um pouco mais limpo para lidar com o caso em que um parâmetro opcional não está definido:
fonte
arg ?= Arg.Default
?Eu gosto de usar o operador de coalescência nula para carregar preguiçosamente determinadas propriedades.
Um exemplo muito simples (e artificial) apenas para ilustrar meu argumento:
fonte
Na verdade, minha experiência é que poucas pessoas estão familiarizadas com o operador ternário (ou mais corretamente, o operador condicional ;
?:
é "ternário" no mesmo sentido que||
é binário ou+
é unário ou binário; no entanto, é o único operador ternário em vários idiomas); portanto, pelo menos nessa amostra limitada, sua declaração falhará ali.Além disso, como mencionado anteriormente, há uma situação importante em que o operador coalescente nulo é muito útil e é sempre que a expressão a ser avaliada tem algum efeito colateral. Nesse caso, você não pode usar o operador condicional sem (a) introduzir uma variável temporária ou (b) alterar a lógica real do aplicativo. (b) claramente não é apropriado em nenhuma circunstância e, embora seja uma preferência pessoal, não gosto de bagunçar o escopo da declaração com muitas variáveis estranhas, mesmo que de curta duração; cenário particular.
Obviamente, se você precisar fazer várias verificações no resultado, o operador condicional ou um conjunto de
if
blocos provavelmente será a ferramenta para o trabalho. Mas, para simples "se isso for nulo, use isso, caso contrário, use-o", o operador coalescente nulo??
é perfeito.fonte
Uma coisa que venho fazendo muito ultimamente é usar coalescência nula para backups
as
. Por exemplo:Também é útil para fazer backup de longas cadeias
?.
que podem falharfonte
O único problema é que o operador de coalescência nula não detecta cadeias vazias.
ie
RESULTADO:
Atualmente, estou olhando para substituir o ?? operador para contornar isso. Seria útil que isso fosse incorporado ao Framework.
Pensamentos?
fonte
??
não pode ser sobrecarregado: msdn.microsoft.com/en-us/library/8edha89s(v=vs.100).aspx - isso seria ótimo para ser sobrecarregado. Eu uso uma combinação:s1.Nullify() ?? s2.Nullify()
wherestring Nullify(this s)
retorna anull
nos casos em que a string está vazia.Você deve usar o que melhor expressa sua intenção. Uma vez que não é um operador de coalesce nulo, usá-lo .
Por outro lado, como é tão especializado, não acho que tenha outros usos. Eu teria preferido uma sobrecarga apropriada do
||
operador, como outros idiomas. Isso seria mais parcimonioso no design da linguagem. Mas, bem …fonte
Legal! Conte-me como alguém que não sabia sobre o operador coalescente nulo - isso é uma coisa bem bacana.
Acho muito mais fácil ler do que o operador ternário.
O primeiro lugar que me vem à mente onde posso usá-lo é manter todos os meus parâmetros padrão em um único local.
fonte
Um caso de uso estranho, mas eu tinha um método em que um
IDisposable
objeto é potencialmente passado como um arg (e, portanto, descartado pelo pai), mas também poderia ser nulo (e, portanto, deve ser criado e descartado no método local)Para usá-lo, o código parecia
Mas com uma coalescência nula torna-se muito mais limpo
fonte
Eu usei assim:
fonte