Existe uma maneira mais agradável de fazer o seguinte:
Preciso que uma verificação de null aconteça no arquivo. Cabeçalhos antes de prosseguir com o loop
if (file.Headers != null)
{
foreach (var h in file.Headers)
{
//set lots of properties & some other stuff
}
}
Resumindo, parece um pouco feio escrever o foreach dentro do if devido ao nível de indentação que ocorre no meu código.
É algo que avaliaria
foreach(var h in (file.Headers != null))
{
//do stuff
}
possível?
Respostas:
Apenas como uma pequena adição estética à sugestão de Rune, você pode criar seu próprio método de extensão:
Então você pode escrever:
Mude o nome de acordo com o gosto :)
fonte
Supondo que o tipo de elementos no arquivo. Cabeçalhos é T, você poderia fazer isso
isso criará um enumerável vazio de T se file.Headers for null. Se o tipo de arquivo for um tipo seu, eu, entretanto, consideraria alterar o getter de
Headers
.null
é o valor de desconhecido, então, se possível, em vez de usar nulo como "Eu sei que não há elementos", quando nulo na verdade (/ originalmente) deve ser interpretado como "Não sei se há algum elemento", use um conjunto vazio para mostrar que você sabe que não há elementos no conjunto. Isso também seria mais seco, pois você não terá que fazer a verificação de nulos com tanta frequência.EDITAR seguindo a sugestão de Jons, você também pode criar um método de extensão alterando o código acima para
No caso em que você não pode alterar o getter, seria a minha preferência, pois expressa a intenção de forma mais clara, dando um nome à operação (OrEmptyIfNull)
O método de extensão mencionado acima pode tornar certas otimizações impossíveis para o otimizador detectar. Especificamente, aqueles que estão relacionados a IList usando a sobrecarga de método podem ser eliminados
fonte
null
) degenerar todo o loop para LCD deIEnumerable<T>
(como usando ?? seria), b) requerer a adição de um Método de Extensão para cada Projeto, ou c) Requer evitarnull
IEnumerables
(Pffft! Puh-LEAZE! SMH.) para começar (cuznull
significa N / A, enquanto lista vazia significa, é aplicável, mas é atualmente, bem, vazio !, ou seja, um funcionário pode ter comissões que são N / A para não vendas ou vazio para vendas quando não ganhou nenhuma).IEnumerable
que é mais restritivo do que osforeach
requisitos, mas menos restritivo do que o requisito deList<T>
na resposta para a qual você vincula. Que têm a mesma penalidade de desempenho de testar se o enumerável é nulo.List<T>
.Francamente, eu aconselho: apenas absorva o
null
teste. Umnull
teste é apenas umbrfalse
oubrfalse.s
; tudo o resto vai envolver muito mais trabalho (exames, atribuições, chamadas de método extra, desnecessárioGetEnumerator()
,MoveNext()
,Dispose()
no iterador, etc).Um
if
teste é simples, óbvio e eficiente.fonte
o "se" antes da iteração está bom, poucas dessas semânticas "bonitas" podem tornar seu código menos legível.
de qualquer forma, se o recuo atrapalhar você, você pode alterar o if para verificar:
e você obterá o loop foreach apenas quando houver um valor verdadeiro na propriedade headers.
outra opção que posso pensar é usar o operador de coalescência nula dentro de seu loop foreach e evitar completamente a verificação de nulos. amostra:
(substitua a coleção pelo seu verdadeiro objeto / tipo)
fonte
Usando o operador nulo condicional e ForEach () que funciona mais rápido do que o loop foreach padrão.
No entanto, você deve lançar a coleção para List.
fonte
Estou usando um pequeno método de extensão agradável para estes cenários:
Dado que Cabeçalhos é do tipo lista, você pode fazer o seguinte:
fonte
??
operador e encurtar a instrução de retorno parareturn list ?? new List<T>;
null
em sua amostrafile.Headers.EnsureNotNull() != null
não é necessário, e está até errado?Para alguns casos, eu preferiria um pouco outra variante genérica, supondo que, como regra, os construtores de coleção padrão retornam instâncias vazias.
Seria melhor nomear este método
NewIfDefault
. Pode ser útil não apenas para coleções, portanto, a restrição de tipoIEnumerable<T>
pode ser redundante.fonte