Pergunta

Eu sempre me vejo escrevendo código semelhante como no exemplo abaixo:

if (object["Object Name"] != null) {
    if (object["Object Name"] == "Some Value") {
        // Do Statement A
    } else {
        // Do Statement B
    }
} else {
    // Do Statement B
}

O problema aqui é que eu tanto verificar se um objeto é nulo ou não e então eu posso verificá-lo para ele é conteúdo real.

"Declaração B" é sempre a mesma e no meu caso é geralmente uma instrução SQL.

Deve haver uma melhor maneira de contornar isso?

Graças
Stephen

Foi útil?

Solução

Há um curto-circuito em C # para que você pode fazer:

if(null != object && object.name == foo)
  do A
else
  do B

C # sempre avalia a primeira expressão na instrução condicional em primeiro lugar e se isso falhar, não tente qualquer outra coisa em que parte da declaração.

Para reforçar ainda mais este ponto, se você estiver indo para ter uma operação cara na declaração condicional, juntamente com um ou mais baratas operações, é bom para colocá-lo no final, se possível, por isso só irá verificar o funcionamento caro quando se realmente precisa. Então, algo como

if(trivial comparison && trivial comparison && REALLY EXPENSIVE OPERATION)

Ele vai agora só executar a operação cara como um último recurso.

Outras dicas

Uma vez que C # faz curto-circuito, sim. Tente isto:

if (object["Object Name"] != null && object["Object Name"] == "Some Value") 
{
    // Do Statement A
} 
else 
{
    // Do Statement B
}

Eu acho que reescrever o if-then-else para isso irá torná-la mais agradável por causa do B-declaração única.

if ((object["Object Name"] != null) && (object["Object Name"] == "Some Value")) 
{
    // Do Statement A
} 
else 
{
    // Do Statement B
}

Por que a dupla verificação? Certamente isso seria suficiente:

if(object["Object Name"] == "Some Value") {
    // Do statement A
} else {
    // Do statement B
}

Eu meio que ver o que você está querendo chegar com verificação nulo, mas o exemplo particular que você dá não requer isso.

EDIT: Agora, se você tivesse escrito este em vez disso:

if (object != null) {
    if (object["Object Name"] == "Some Value") {
        // Do Statement A
    } else {
        // Do Statement B
    }
} else {
    // Do Statement B
}

, em seguida, a solução seria:

if(object != null && object["Object Name"] == "Some Value") {
    // Do Statement A
} else {
    // Do Statement B
}

IMPORTANTE:. Não fazer o método geral de curto-circuito

Bem, você poderia criar uma função separada para executar a pesquisa, especialmente se a consulta permanece a mesma. Então, algo como isto: (pseudocódigo entrada)

private bool IsNullCheck(string objectName)
{
  if (object["Object Name"] != null)
     return false;
  else
     // statement B
}

if (!IsNullCheck("Object Name") && if(object["Object name"] == "Value") {
   // stuffs

} 
else 
{
        // Do Statement B
}

ou similar.

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