C# ist ja bekanntlich reich an Syntax-Candy (so der Referent damals auf dem Visual Studio 2005: First Contact-Techtalk. Zu diesen mehr- oder weniger nützlichen Features gehört auch der bedingte Operator ?:, den C# vermutlich vom guten, alten C++ geerbt hat.
Dessen Funktion ist schnell erklärt: Es handelt sich um eine verkürzte Schreibweise für eine if-else-Bedingung:
condition ? first_expression : second_expression;
Bzw.
x == y ? method1() : method2()
Eigentlich vermeide ich es tunlichst, dieses Konstrukt einzusetzen, weil es den Code – im Gegensatz zu einer schön strukturierten if-else-Bedingung unleserlich und schwerer debugbar (sagt man das so?) macht. Allerdings ist mir nun bereits zum wiederholten Male eine Situation untergekommen, in welcher der ?:-Operator durchaus Sinn macht:
Nehmen wir an, ich will eine (rekursive) Funktion debuggen und dazu mittels Debug.WriteLine ein paar Statusmeldungen ausgeben. In meinem Fall das OuterXml eines XPathNavigators. Dieses kann jedoch relativ lang sein – was die Debug-Ausgabe wiederum unlesbar macht. Also ist es an sich eine gute Idee, die Länge der Ausgabe zu beschränken, z.B. auf maximal 80 Zeichen:
Debug.WriteLine(navi.OuterXml.Substring(0, 80));
Soweit – so gut – ist das OuterXml nun aber kürzer als 80 Zeichen bekomme ich eine schöne Exception. Die Lösung des Problems ist es, zu überprüfen, ob das OuterXml kürzer als 80 Zeichen ist – wenn ja wird es komplett ausgegeben, sonst gekürzt. Benutze ich dafür nun eine ganz normale if-else-Bedingung sähe der Debug-Hilfscode in etwa so aus:
if (navi.OuterXml.Length < 80)
Debug.WriteLine(navi.OuterXml);
else
Debug.WriteLine(navi.OuterXml.Substring(0, 80);
Oder Dank ?:-Operator mit einer Zeile wesentlich kürzer:
Debug.WriteLine((navi.OuterXml.Length < 80) ? navi.OuterXml : navi.OuterXml.Substring(0, 80));
Hallo,
richtig hässlich wird es ja erst, wenn man diese Konstrukte verschachtelt, so a la
a = cond1? (cond2? a : b) : c;
Und sowas ist mir bisher schon untergekommen. Das wäre für mich ein Grund, solche Konstrukte zu verbieten, auch wenn sie manchmal _wirklich_ praktisch sind.
Moritz
Oh ja, das ist wirklich hässlich
Ich kenne einige C++-Entwickler, die mit derartigen Konstrukten bis zum Erbrechen arbeiten. Quasi nach dem Motto “Sämtlicher Code in eine Zeile”. Furchtbar.