Czy istnieje IIf
odpowiednik w C #? Lub podobny skrót?
c#
.net
conditional-operator
iif-function
Saif Khan
źródło
źródło
Odpowiedzi:
C # ma
?
operator trójskładnikowy, podobnie jak inne języki w stylu C. Jednak nie jest to całkowicie równoważne zIIf()
; istnieją dwie ważne różnice.Aby wyjaśnić pierwszą różnicę, argument części fałszywej dla tego
IIf()
wywołania powoduje aDivideByZeroException
, mimo że argumentem logicznym jestTrue
.IIf(true, 1, 1/0)
IIf()
jest tylko funkcją i tak jak wszystkie inne funkcje, wszystkie argumenty muszą zostać ocenione przed wywołaniem. Innymi słowy,IIf()
czy nie ma zwarcia w tradycyjnym sensie. Z drugiej strony to trójskładnikowe wyrażenie powoduje zwarcie, więc jest całkowicie w porządku:(true)?1:1/0;
Inna różnica
IIf()
nie jest bezpieczna dla typu. Przyjmuje i zwraca argumenty typuObject
. Operator trójskładnikowy jest bezpieczny dla typów. Używa wnioskowania o typie, aby wiedzieć, z jakimi typami ma do czynienia. Zauważ, że możesz to bardzo łatwo naprawić za pomocą własnej ogólnejIIF(Of T)()
implementacji, ale po wyjęciu z pudełka tak nie jest.Jeśli naprawdę chcesz
IIf()
w C #, możesz to mieć:object IIf(bool expression, object truePart, object falsePart) {return expression?truePart:falsePart;}
lub implementacja ogólna / bezpieczna dla typu:
T IIf<T>(bool expression, T truePart, T falsePart) {return expression?truePart:falsePart;}
Z drugiej strony, jeśli chcesz mieć operator trójskładnikowy w języku VB, program Visual Studio 2008 i nowsze wersje zapewniają nowy
If()
operator, który działa jak operator trójskładnikowy języka C #. Używa wnioskowania o typie, aby wiedzieć, co zwraca, i tak naprawdę jest operatorem, a nie funkcją. Oznacza to, że nie ma problemów z wstępną oceną wyrażeń, mimo że ma semantykę funkcji.źródło
VB.NET:
If(someBool, "true", "false")
DO#
someBool ? "true" : "false";
źródło
operator trójskładnikowy
bool a = true; string b = a ? "if_true" : "if_false";
źródło
Przydatny jest także operator łączenia ??:
VB:
Return Iif( s IsNot Nothing, s, "My Default Value" )
DO#:
return s ?? "My Default Value";
źródło
Przykład:
string itemText = count > 1 ? "items" : "item";
http://zamirsblog.blogspot.com/2011/12/c-vb-equivalent-of-iif.html
źródło
To operator trójskładnikowy
?
string newString = i == 1 ? "i is one" : "i is not one";
źródło
Jest ograniczona w tym, że nie możesz tam umieszczać oświadczeń. Możesz umieścić tylko wartości (lub rzeczy, które zwracają / oceniają wartości), aby zwrócić
To działa („a” to statyczna liczba int w klasie Blah)
Blah.a=Blah.a<5?1:8;
(nawiasy okrągłe znajdują się niedokładnie między równymi a znakiem zapytania).
To nie działa.
Blah.a = Blah.a < 4 ? Console.WriteLine("asdf") : Console.WriteLine("34er"); or Blah.a = Blah.a < 4 ? MessageBox.Show("asdf") : MessageBox.Show("34er");
Dlatego do zwracania wartości można używać tylko operatora trójargumentowego języka C #. Nie jest to więc skrócona forma if. Javascript i być może niektóre inne języki pozwalają na umieszczanie tam instrukcji.
źródło
Action
robić, co chcesz.iif
lub operator trójskładnikowy, pozwólcie wstawić tam wartość zwracaną, tak jakBlah.a = Blah.a < 4 ? Console.WriteLine("asdf"); return 1: Console.WriteLine("34er") ; return 2;
wtedy, gdyby na to pozwalał, zadziałałoby, ale najwyraźniej nie. I tak, wciąż ustawia wartość i nie, nie wywołuje tam żadnej nowej metody.