O que é "??" operador para? [duplicado]
-
05-07-2019 - |
Pergunta
Esta questão já tem uma resposta aqui:
Eu estava pensando sobre sinais ??
no código C#
. Para que serve? E como eu posso usá-lo?
E sobre int?
? É um int anulável?
Veja também:
Solução
É o chamado "nulo operador coalescente" e funciona assim:
Em vez de fazer:
int? number = null;
int result = number == null ? 0 : number;
Agora você pode apenas fazer:
int result = number ?? 0;
Outras dicas
É a operador nulo coalescentes . Foi introduzido em C # 2.
O resultado da a ?? b
expressão é a
se isso não é nulo, ou b
contrário. b
não é avaliada a menos que seja necessário.
Duas coisas agradáveis:
-
O tipo geral da expressão é o do segundo operando, o que é importante quando você estiver usando tipos de valor anulável:
int? maybe = ...; int definitely = maybe ?? 10;
(Note que você não pode usar um tipo de valor não nulo como primeiro operando - seria inútil.)
-
As regras de associatividade significa que você pode encadear isso realmente facilmente. Por exemplo:
string address = shippingAddress ?? billingAddress ?? contactAddress;
Isso vai usar o primeiro valor não nulo para fora do transporte, cobrança ou endereço para contato.
Isso é o operador coalesce. Essencialmente é uma abreviação para o seguinte
x ?? new Student();
x != null ? x : new Student();
MSDN Documentação sobre o operador
É o novo operador nulo Coalesce.
O ?? operador retorna da mão esquerda operando se não for nulo, ou então ele retorna o operando à direita.
Você pode ler sobre ele aqui: http://msdn.microsoft.com/en-us/ biblioteca / ms173224 (VS.80) .aspx
É um atalho para:
Text = (category == null ? "Home" : category);
é o operador coalesce. ele irá retornar outro valor se o primeiro valor é nulo
string value1 = null;
string value2 = "other";
string value3 = value1 ?? value2; // assigns "other" to value 3
verifica se categoria é null -. Quando este for o caso, o valor nulo é substituído por "Home"
Um dos meus usos favoritos para o nulo coalescentes operador é para evitar se declarações no meu código (eu acho que se declarações são feias e apenas coisas fiquem amontoados na maioria das vezes). Por exemplo, ter um cenário típico onde se pode optar por carregar algo de cache, se disponível, caso contrário carregar a partir do db e preencher o cache.
private SomeData GetData() {
var data = HttpRuntime.Cache.Get("key") as SomeData;
if (data == null) {
data = DAL.GetData(some parameters...);
HttpRuntime.Cache.Add("key", data, ....);
}
return data;
}
Para mim, isso é código feio. Eu posso ser um pouco anal, mas porque não refatorar-lo a esta vez?
private SomeData GetDataAndCache() {
var data = DAL.GetData(some parameters...);
HttpRuntime.Cache.Add("key", data, ....);
return data;
}
private SomeData GetData() {
var data = HttpRuntime.Cache.Get("key") as SomeData;
return data ?? GetDataAndCache();
}
Segue-se mais de perto SRP e é mais limpo e mais fácil de ler, IMO. As funções executar exatamente uma função claramente identificável cada um.
Se categoria é nulo, texto vai se tornar "Home"
Retorna o valor primeiro não-nulo. Handy.
int? é um int nulo, o que significa que pode ter os valores de um int normal e nulo. Leia este para mais detalhes.
Essa é a nulo coalescentes operador . É usado com anulável tipos (entre outras coisas , desculpe:)