Existe uma maneira simples de fazer o seguinte:
String s = myObj == null ? "" : myObj.ToString();
Sei que posso fazer o seguinte, mas realmente considero isso um hack:
String s = "" + myObj;
Seria ótimo se Convert.ToString () tivesse uma sobrecarga adequada para isso.
Convert.ToString()
faz exatamente a primeira coisa que você escreveu abaixo.Respostas:
Edição C # 6.0:
Com C # 6.0, agora podemos ter uma versão sucinta e livre de elenco do método original:
Ou até mesmo usando interpolação:
Resposta Original:
ou
para ser ainda mais conciso.
Infelizmente, como foi apontado, você frequentemente precisará de um elenco em ambos os lados para fazer isso funcionar com tipos diferentes de String ou Object:
Portanto, embora pareça elegante, o elenco é quase sempre necessário e não é tão sucinto na prática.
Como sugerido em outro lugar, eu recomendo talvez usar um método de extensão para tornar isso mais limpo:
fonte
string.Format irá formatar null como uma string vazia e chamar ToString () em objetos não nulos. Pelo que entendi, era isso que você procurava.
fonte
"" + myObj
. Mas eu li que cria strings extras.str.Concat(myObj)
parece funcionar muito bem e é "ainda mais rápido".Houve um
Convert.ToString(Object value)
desde .Net 2.0 (aproximadamente 5 anos antes de este Q ser perguntado), que parece fazer exatamente o que você deseja:http://msdn.microsoft.com/en-us/library/astxcyeh(v=vs.80).aspx
Estou perdendo / interpretando mal algo realmente óbvio aqui?
fonte
Com um método de extensão, você pode fazer isso:
O seguinte não gravaria nada na tela e não geraria uma exceção:
fonte
string s = "" + myObj;
é hackeado, chamar uma função em um objeto nulo deve cair no mesmo barco. Eu votaria contra isso, mas resolve o problema em questão, só discordo do uso. Objetos nulos devem ser lançadosNullReferenceException
, mesmo em métodos de extensão.ToStringOrEmptyWhenNull
.this
parâmetro) porque eles são apenas açúcar sintático. Isso éx.SomeExtensionMethod()
açúcar sintático paraSomeStaticClass.SomeExtensionMethod(x);
Assim, quandox
énull
, não estamos tentando invocar um método em umnull
objeto, mas sim passando umnull
objeto para um método estático. Se e somente se esse método verifica umnull
parâmetro e lança ao encontrar tal um método de extensão "invocado" em umnull
lançamento de objeto.Eu discordo disso:
é um hack de qualquer forma. Acho que é um bom exemplo de código claro. É absolutamente óbvio o que você deseja alcançar e que espera null.
ATUALIZAR:
Vejo agora que você não estava dizendo que isso era um hack. Mas está implícito na pergunta que você acha que este não é o caminho a seguir. Na minha opinião, é definitivamente a solução mais clara.
fonte
seria o caminho mais curto, eu acho, e também teria sobrecarga de desempenho insignificante. Porém, tenha em mente que não seria muito claro para o leitor do código qual é a intenção.
fonte
Concat
na verdade, faz uma verificação de nulo por baixo e retornastring.Empty
ouarg0.ToString()
, que parece ter um desempenho um pouco melhor (quero dizer, estamos falando de ms aqui).na verdade eu não entendi o que você quer fazer. Pelo que entendi, você pode escrever este código de outra maneira como esta. Você está perguntando isso ou não? Você pode explicar mais?
fonte
string s = string.IsNullOrEmpty(myObj) ? string.Empty : myObj.ToString();
Posso levar uma surra pela minha resposta, mas lá vai de qualquer maneira:
Eu simplesmente escreveria
string s = "" if (myObj! = null) {x = myObj.toString (); }
Há uma recompensa em termos de desempenho por usar o operador ternário? Eu não sei de cara.
E, claramente, como alguém mencionado acima, você pode colocar esse comportamento em um método como safeString (myObj) que permite a reutilização.
fonte
Tive o mesmo problema e resolvi-o simplesmente lançando o objeto em uma corda. Isso também funciona para objetos nulos porque as strings podem ser nulas. A menos que você absolutamente não queira ter uma string nula, isso deve funcionar muito bem:
fonte
Alguns testes de desempenho (de velocidade) resumindo as várias opções, não que isso realmente importe #microoptimization (usando uma extensão do linqpad )
Opções
Provavelmente importante ressaltar que
Convert.ToString(...)
manterá uma string nula.Resultados
Objeto
Corda
fonte
O comentário de Holstebroe seria sua melhor resposta:
Se
myObj
for nulo, Format coloca um valor de String vazia lá.Ele também atende aos requisitos de uma linha e é fácil de ler.
fonte
Embora esta seja uma pergunta antiga e o OP pedisse C #, gostaria de compartilhar uma solução VB.Net para aqueles que trabalham com VB.Net em vez de C #:
Infelizmente, o VB.Net não permite o operador? Após uma variável, então myObj? .ToString não é válido (pelo menos não em .Net 4.5, que usei para testar a solução). Em vez disso, uso o If para retornar uma string vazia no caso de myObj ist Nothing. Portanto, a primeira Tostring-Call retorna uma string vazia, enquanto a segunda (onde myObj não é Nothing) retorna "42".
fonte