Nullable Reference Types in ein bestehendes Projekt einführen

Nullable Reference Types in ein bestehendes Projekt einführen

- Matt

<Nullable>enable</Nullable> in ein zehn Jahre altes Projekt zu schreiben, erzeugt bei mir 3.400 Warnungen. Die übliche Reaktion darauf ist, den Schalter wieder zu entfernen.

Es gibt einen brauchbareren Weg.

Erst nur beobachten

Statt enable gibt es Zwischenstufen:

<Nullable>warnings</Nullable>

Damit werden die Prüfungen aktiv, aber die Anmerkungen im eigenen Code gelten noch nicht. Die Zahl ist niedriger und man sieht, wo die echten Probleme sitzen, nämlich dort, wo eine fremde Bibliothek null liefern kann.

Umgekehrt geht auch:

<Nullable>annotations</Nullable>

Hier darf man string? schreiben, bekommt aber keine Warnungen. Das ist nützlich, wenn man erst die eigene API beschreiben will, ohne dass sofort alles rot ist.

Dann Datei für Datei

Der eigentliche Trick sind die Direktiven pro Datei:

#nullable enable

Damit lässt sich das Projekt auf disable lassen und trotzdem Datei für Datei umstellen. Jede Datei, die man ohnehin anfasst, bekommt die Zeile oben hinein und wird sauber gemacht. Nach einem halben Jahr ist der aktive Teil der Codebasis durch, ohne dass jemand eine Woche dafür freigeschaufelt hätte.

Was man nicht tun sollte

Das Ausrufezeichen als Werkzeug benutzen. kunde!.Name bringt die Warnung zum Verschwinden und sagt dem Compiler, er solle sich raushalten. Wenn die Annahme falsch ist, hat man dieselbe NullReferenceException wie vorher, nur mit dem Unterschied, dass jemand ausdrücklich behauptet hat, sie könne nicht auftreten.

Ich erlaube mir das an genau zwei Stellen: nach einer Prüfung, die der Compiler nicht versteht, und bei Feldern, die ein Rahmenwerk befüllt. Für Letzteres ist = null!; mit einem Kommentar ehrlicher als das Ausrufezeichen an jeder Verwendungsstelle.

Was es bringt

Bei einem der Projekte hier sind die NullReferenceException in den Fehlermeldungen um etwa zwei Drittel zurückgegangen. Nicht weil die Prüfung jeden Fall findet, sondern weil man beim Umstellen an Stellen vorbeikommt, an denen man merkt, dass die Annahmen nie gestimmt haben.

Das ist der eigentliche Gewinn und der Grund, warum ich es trotz des Aufwands mache.