Debugging: Single-Line Condition

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));

2 Kommentare

  1. 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

  2. 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.