Algo que eu me vejo fazendo cada vez mais é verificar se uma string está vazia (como em ""
ou nula) e um operador condicional.
Um exemplo atual:
s.SiteNumber.IsNullOrEmpty() ? "No Number" : s.SiteNumber;
Este é apenas um método de extensão, é equivalente a:
string.IsNullOrEmpty(s.SiteNumber) ? "No Number" : s.SiteNumber;
Como está vazio e não nulo, ??
não fará o truque. Uma string.IsNullOrEmpty()
versão do ??
seria a solução perfeita. Estou pensando que deve haver uma maneira mais limpa de fazer isso (espero!), Mas não consegui encontrá-lo.
Alguém sabe de uma maneira melhor de fazer isso, mesmo que seja apenas no .Net 4.0?
c#
string
coalesce
null-coalescing-operator
Nick Craver
fonte
fonte
let (|?) x y = if String.IsNullOrEmpty(x) then y else x
e use-o comos.SiteNumber |? "No Number"
.Respostas:
Não há uma maneira integrada de fazer isso. Você pode fazer com que seu método de extensão retorne uma string ou um valor nulo, o que permitiria ao operador coalescente funcionar. Isso seria estranho, no entanto, e eu pessoalmente prefiro sua abordagem atual.
Como você já está usando um método de extensão, por que não fazer um que retorne o valor ou o padrão:
fonte
???
operador em C # 5, quem sabe.item ?? x=> x.ToString() : null;
C # já nos permite substituir valores por
null
with??
. Então, tudo o que precisamos é de uma extensão que converta uma string vazia emnull
, e então a usamos assim:Classe de extensão:
fonte
Sei que essa é uma pergunta antiga - mas eu estava procurando uma resposta e nenhuma das opções acima se encaixava em minha necessidade e no que acabei usando:
Uso:
EDIT: Uma maneira ainda mais compacta de escrever esta função seria:
fonte
using System.Linq
Eu tenho algumas extensões de utilitário que eu gosto de usar:
Edit: Inspirado pela resposta do sfsr , adicionarei esta variante à minha caixa de ferramentas a partir de agora:
fonte
@
prefixo no@default
parâmetro faz? Eu nunca vi isso antes.default
como um nome de variável, mesmo que seja uma palavra-chave reservada em C #.Um método de extensão um pouco mais rápido do que o proposto anteriormente, talvez:
fonte
code
sequência estática pública Coalesce (esta sequência @this, string @default = "") {return (@this == null || String.IsNullOrWhiteSpace (@this))? @ padrão: @; }Uma das vantagens do operador de coalescência nula é o curto-circuito. Quando a primeira parte não é nula, a segunda parte não é avaliada. Isso pode ser útil quando o fallback requer uma operação cara.
Acabei com:
Uso:
fonte
Eu simplesmente uso um método de extensão NullIfEmpty que sempre retornará nulo se a string estiver vazia permitindo ?? (Operador de coalizão nulo) a ser usado normalmente.
Isso então permite ?? para ser usado normalmente e facilita a leitura do encadeamento.
fonte
que tal um método de extensão de string ValueOrDefault ()
ou retorne nulo se a sequência estiver vazia:
Não tentei essas soluções embora.
fonte
...OrDefault()
seria confuso se não se comportasse como o resto dos...OrDefault()
métodos da estrutura . Goste ou não, a MS atribuiu um significado específico àquele nome e desvio desse comportamento nos métodos personalizados é desnecessariamente confuso para os usuários da sua API.Estou usando meu próprio método de extensão Coalesce de string. Como os que estão aqui estão usando LINQ e perdendo recursos absolutamente para operações demoradas (estou usando em loops apertados), compartilharei o meu:
Eu acho que é bastante simples, e você nem precisa se preocupar com valores de string nulos. Use-o assim:
Eu uso isto muito. Uma daquelas funções "utilitárias" das quais você não pode viver depois de usá-lo pela primeira vez :-)
fonte
s2.Coalesce(s3)
é executado mesmo quando não é necessário. Melhor usar umaNullIfEmpty()
extensão e??
.Eu gosto da brevidade do seguinte método de extensão
QQQ
para isso, embora, é claro, um operador como? seria melhor. Mas podemos resolver isso permitindo que não apenas dois, mas três valores de opção de cadeia sejam comparados, o que encontra a necessidade de lidar de vez em quando (veja a segunda função abaixo).fonte
Or
, e eu usaria aparams
palavra - chave, como as outras respostas, o que evita definições duplicadas para vários parâmetros.params
, seria melhor não fazer isso para o cenário padrão ou dois, poisparams
faz com que uma matriz seja alocada desnecessariamente quando você tiver apenas uma ou duas entradas padrão. Depois disso, faz sentido.