Pergunta

Existe um equivalente IIf em C#? Ou atalho semelhante?

Foi útil?

Solução

C # tem o operador ? ternário, como outras línguas de estilo C. No entanto, este não é perfeitamente equivalente a IIf(); existem duas diferenças importantes.

Para explicar a primeira diferença, o argumento falso-parte para esta chamada IIf() provoca uma DivideByZeroException, embora o argumento boolean é True.

IIf(true, 1, 1/0)

IIf() é apenas uma função, e como todas as funções de todos os argumentos devem ser avaliados antes que a chamada é feita. Dito de outra forma, IIf() não curto-circuito no sentido tradicional. Por outro lado, esta expressão ternária faz curto-circuito, e por isso é perfeitamente bem:

(true)?1:1/0;

A outra diferença é IIf() não é tipo seguro. Ele aceita e retorna argumentos do tipo Object. O operador ternário é tipo seguro. Ele usa a inferência de tipos de saber quais os tipos que está lidando. Note que você pode corrigir isso muito facilmente com sua própria implementação IIF(Of T)() genérico, mas fora da caixa que não é do jeito que está.

Se você realmente quer IIf() em C #, você pode tê-lo:

object IIf(bool expression, object truePart, object falsePart) 
{return expression?truePart:falsePart;}

ou uma implementação tipo seguro / genérica:

T IIf<T>(bool expression, T truePart, T falsePart) 
{return expression?truePart:falsePart;}

Por outro lado, se você deseja que o operador ternário em VB, Visual Studio 2008 e, posteriormente, fornecer uma nova If() operador que funciona como operador ternário 's C #. Ele usa a inferência de tipos para saber o que ele está retornando, e é realmente um operador em vez de uma função. Isto significa que há sem problemas de expressões pré-avaliação, mesmo que ele tem a semântica de função.

Outras dicas

VB.NET:

If(someBool, "true", "false")

C #

someBool ? "true" : "false";

o operador ternário

bool a = true;

string b = a ? "if_true" : "if_false";

Também útil é o operador coalesce ??:

VB:

Return Iif( s IsNot Nothing, s, "My Default Value" )

C #:

return s ?? "My Default Value";
booleanExpression ? trueValue : falseValue;

Exemplo:

string itemText = count > 1 ? "items" : "item";

http://zamirsblog.blogspot.com/2011/12/c -vb equivalente-de-iif.html

É o ? operador ternário

string newString = i == 1 ? "i is one" : "i is not one";

É limitado em que você não pode colocar declarações lá. Você só pode valores (ou coisas que o retorno / avaliar a valores) colocou, para retornar

Isso funciona ( 'a' é um int estática dentro da classe Blah)

Blah.a=Blah.a<5?1:8;

(entre parênteses estão impicitly entre os iguais e o ponto de interrogação).

Isso não funciona.

Blah.a = Blah.a < 4 ? Console.WriteLine("asdf") : Console.WriteLine("34er");
or
Blah.a = Blah.a < 4 ? MessageBox.Show("asdf") : MessageBox.Show("34er");

Assim, você só pode usar o c # operador ternário para retornar valores. Portanto, não é completamente como uma forma abreviada de um caso. Javascript e talvez algumas outras línguas deixar você colocar declarações lá.

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