Short Tip #01: operatory ?: oraz ?? w C#
Poniżej krótki sposób jak pozbyć się ze swojego kodu pewnych potworków.
Bardzo częstą konstrukcją if (..) then .. else ..
, jednak niech Was ręka boska broni od napisania czegoś takiego:
private MyType ChooseSomething() { MyType possibleResult1; MyType possibleResult2; // do some operations if (someCondition) return possibleResult1; else return possibleResult2; }
Zamiast tego proponuję użycie operatora „?” (znak zapytania), o następującej składni:
condition ? expression1 : expression2;
który zwraca expression1
, jeżeli warunek condition
jest prawdziwy lub expression2
w przeciwnym przypadku.
Refactoring potworka z początku posta daje następujący rezultat:
private MyType ChooseSomething() { MyType possibleResult1; MyType possibleResult2; // do some operations return someCondition ? possibleResult1 : possibleResult2; }
Kolejny przypadek pojawia się, gdy następuje sprawdzenie czy dany obiekt nie jest null
-em. Poniżej przykładowy kod (już po refactoringu z zastosowaniem operatora ?: )
private MyType ComputeSomething() { MyType possibleResult = null; // do some operations return (possibleResult != null) ? possibleResult : defaultValue; }
Wprowadzenie kolejnego operatora „??
” (podwójny znak zapytania) jeszcze bardziej skróci zapis. Operator ten zwraca wartość po swojej lewej stronie wtedy, gdy nie jest ona równa null
, w przeciwnym przypadku zwróci wartość po prawej stronie. Zastosowanie powyższego operatora do metody ComputeSomething()
da następujący rezultat:
private MyType ComputeSomething() { MyType possibleResult = null; // do some operations return possibleResult ?? defaultValue; }
Przez użycie odpowiednich konstrukcji ilość tzw. „spaghetti code” znacznie się zmniejsza.
P.S. „Short Tip” to w założeniu regularny cykl krótkich artykułów przybliżających niewielkich rozmiarów zagadnienia składniowe/ideowe/estetyczne
Odpowiedzi: 3 Zostaw komentarz
Też nie wiedziałem o „??”, a wygląda na naprawdę użyteczne :).
został dodany w C# 2.0. Strona na MSDN: link
o_0 Dlaczego ja o tym ‚??’ nie wiedziałem wcześniej! Od której wersji .NET to jest obecne w C#?