I pode ignorar aviso CodeAnalysis: substituir corda == “” com string.IsNullOrEmpty?
-
12-09-2019 - |
Pergunta
Eu tenho código semelhante a este:
string s = CreateString();
if (s == "") foo(s);
Se s iguais "", foo deve ser chamado. Se a string é nulo, o que nunca deveria acontecer, em seguida, um NullReferenceException é bom (como este é, afinal, uma situação excepcional).
CodeAnalysis me diz para testar s.IsNullOrEmpty. Isto iria alterar a funcionalidade de uma forma nunintended.
O desempenho não é um problema.
É seguro suprimir o aviso CA1820 associado?
Editar:. Atualizado amostra de código e um texto para refletir melhor o meu caso
Editar: Este é o (ligeiramente alteradas) código real (é em uma implementação IXmlSerializable standard):
public void ReadXml (XmlReader reader)
// ...
string img = reader.ReadElementString ("Image");
if (img != "") {
Image = Image.FromFile(img);
}
// ...
Solução
Ele irá se comportar de forma diferente com relação a valores nulos, por isso depende do que você quer que aconteça; você menciona que NullReferenceException
seria OK, mas não há nada no código citou que elevaria esse, daí porque ele poderia causar erros inesperados jusante.
Nunca Have , mas eu estou sempre tentado a acrescentar:
static bool IsNullOrEmpty(this string value) {
return string.IsNullOrEmpty(value);
}
para que eu possa usar:
if (s.IsNullOrEmpty()) foo();
Outras dicas
especificações:
Se s iguais "", foo deve ser chamado. Se a string é nulo, o que nunca deve acontecer, então um NullReferenceException está bem.
Apenas teste do comprimento da corda como aconselhado em a regra CodeAnalysis :
if (s.Length == 0) foo(s);
Sua pergunta:
É seguro suprimir o associado aviso CA1820?
Você pode ignorá-lo, seu código vai funcionar, mas eu não iria aconselhá-lo, seguir as orientações , tanto quanto você puder. Mesmo que o tópico (desempenho) não é um problema, o seu código será mais consistente e você se acostumar a escrever o código padrão.
Cada análise de código tem associado documentação que você pode acessar por highligting o aviso e pressionar F1 . Você também pode botão direito do mouse no item para obter ajuda.
Em qualquer caso, aqui está a documentação que explica que a advertência específica .
De acordo com essa documentação, que é "seguro eliminar um aviso esta regra se o desempenho não é um problema".
Seria melhor para escrever o teste como:
if(s != null && s == "")
Você pode então processar um valor nulo em outro if
Você não está realmente ignorando o aviso, você olhou para o código e decidiu que o aviso não se aplica. Esta é uma condição perfeitamente razoável em que para suprimir o aviso.
pura especulação
Eu gostaria de saber um pouco mais sobre o que você estava tentando fazer, no entanto. Eu suspeito que pode haver uma maneira melhor de lidar com isso. O padrão me faz lembrar de retornar uma mensagem de erro ou esvaziar para sinalizar o sucesso de um método. Se for esse o caso, eu consideraria retornando vazio e lançar uma exceção em caso de falha ou retornar bool e só lançar exceções quando a mensagem é crítica e retornar true / false contrário.
Se nulo é OK, você vai ficar bem de qualquer maneira.
Sim.
Mas eu concordo com CodeAnalysis com String.IsNullOrEmpty é uma escolha segura.
Não tratamento de exceção enquanto você pode é gennerally uma má idéia tão CA está bem no que você quer necessidade de nulo tratar como vazia ou tratar a exceção. Uma exceção de referência nula causados ??pela utilização de um valor de retorno é uma coisa muito ruim. No mínimo, colocar em Debug.Assert (s! = Null) e comparar com string.Empty