Esiste un equivalente IIf
in C#
? O una scorciatoia simile?equivalente iif in C#
risposta
C# ha la operatore ternario, come altri linguaggi in stile C. Tuttavia, questo non è perfettamente equivalente a iif. Ci sono due importanti differenze.
Per spiegare il primo, questo iif()
chiamata causerebbe un'eccezione DivideByZero anche se l'espressione è vero perché iif
è solo una funzione e tutti gli argomenti devono essere valutati prima di chiamare:
iif(true, 1, 1/0)
dirla in altro modo, iif non cortocircuito nel senso tradizionale, come indica la domanda. D'altra parte, questa espressione ternaria fa e quindi è perfettamente bene:
(true)?1:1/0;
L'altra differenza è che iif
non è di tipo sicuro. Accetta e restituisce argomenti di tipo object
. L'operatore ternario utilizza l'inferenza del tipo per sapere di che tipo si tratta. Si noti che è possibile risolvere questo problema molto facilmente con un'implementazione generica, ma fuori dalla scatola è così com'è.
Se si vuole veramente IIF() in C#, è possibile averlo:
object iif(bool expression, object truePart, object falsePart)
{return expression?truePart:falsePart; }
o un tipo di sicurezza/implementazione generica:
T iif<T>(bool expression, T truePart, T falsePart)
{ return expression?truePart:falsePart;}
D'altra parte, se si desidera l'operatore ternario in VB, Visual Studio 2008 e versioni successive fornisce un nuovo operatore che funziona più come ternario di C#. Utilizza l'inferenza di tipo per sapere cosa sta restituendo, ed è un operatore piuttosto che una funzione quindi, anche se ha semantica delle funzioni, non ci sono problemi dalle espressioni di pre-valutazione.
VB9 supporta un vero operatore ternario. Se (SomeBool, MessageBox.Show ("True"), MessageBox.Show ("False")) Come visto qui: http://community.bartdesmet.net/blogs/bart/archive/2007/08/ 31/visual-basic-9-0-the-if-ternary-operator.aspx – snarf
Lo menziono nell'ultimo paragrafo, ma la domanda riguardava specificamente IIf(). –
l'operatore ternario
bool a = true;
string b = a ? "if_true" : "if_false";
aggiungerei un commento lì che è stringa b = (un? "Asdf": "dsrs"); Quindi è possibile capire meglio come funziona la cosa e vedere che non è qualcosa di veramente strano e privo di senso (stringa b = a)? "sdf": "sdsdf"). – barlop
E 'l'operatore ternario ?
string newString = i == 1 ? "i is one" : "i is not one";
VB.NET:
If(someBool, "true", "false")
C#
someBool ? "true" : "false";
Mentre ciò è vero per le espressioni semplici, le due forme non sono esattamente equivalenti se ci sono effetti collaterali nelle espressioni alternative. Iif (t, foo(), bar()) chiamerà sia foo() che bar(), mentre t? foo(): bar() chiamerà solo foo() o bar() ma non entrambi. Vedi la risposta di Joel Coehoorn a questa domanda per maggiori informazioni. –
Risposta aggiornata per utilizzare la funzione "If" di VB.NET anziché "IIf" in modo che i due blocchi di codice siano equivalenti. –
Anche utile è l'operatore si fondono ??:
VB:
Return Iif(s IsNot Nothing, s, "My Default Value")
C#: "?"
return s ?? "My Default Value";
booleanExpression ? trueValue : falseValue;
Esempio:
string itemText = count > 1 ? "items" : "item";
http://zamirsblog.blogspot.com/2011/12/c-vb-equivalent-of-iif.html
E 'limitata dal fatto che non si può mettere le dichiarazioni in là. Si può solo mettere i valori (o cose che restituiscono/restituiscono valori), per tornare
Questo funziona ('a' è un int statico all'interno della classe Blah)
Blah.a=Blah.a<5?1:8;
(parentesi tonde sono impicitly tra il uguale e il punto interrogativo).
Questo non funziona.
Blah.a = Blah.a < 4 ? Console.WriteLine("asdf") : Console.WriteLine("34er");
or
Blah.a = Blah.a < 4 ? MessageBox.Show("asdf") : MessageBox.Show("34er");
Quindi è possibile utilizzare solo l'operatore t # ternario per restituire valori. Quindi non è proprio come una forma abbreviata di un if. Javascript e forse alcune altre lingue ti permettono di mettere le dichiarazioni lì dentro.
Penso che intendessi "scorciatoia", piuttosto che "cortocircuito" (che ha un significato specifico per gli operatori booleani) - ho ragione? – Blorgbeard