I pode ignorar aviso CodeAnalysis: substituir corda == “” com string.IsNullOrEmpty?

StackOverflow https://stackoverflow.com/questions/1661024

  •  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);
    }
    // ...
Foi útil?

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.

aviso

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top