© S&S Media
Non-nullable Reference Types und Nullable-Kontexte in C# 8.0

Kreuzzug gegen Null Reference Exceptions


Referenztypen können seit C# 1.0 den Nullwert annehmen. In C# 8.0 gibt es nun auch Referenztypen, die nicht mehr Null werden können. Außerdem kann der Compiler den Softwareentwickler warnen, wenn er mit seiner Programmierung Null-Reference-Laufzeitfehler riskiert.

Es kann sich kaum ein C#-Programmierer auf dieser Welt davon freisprechen, dass er in seinem Programmcode nicht schon einmal einen Null-Reference-Laufzeitfehler („Object reference not set to an instance of an object“) produziert hat. Meist treten die Fehler auf, wenn man Objektreferenzen von Unterroutinen oder Steuerelementen empfängt und vor dem Aufruf einer Operation nicht prüft, ob die empfangene Objektreferenz null ist. Sehr beliebt ist der Fehler bei Zeichenketten, denn string ist in C# ein Nullable Reference Type. Wenn eine Stringvariable s den Wert null hat, reicht ein Aufruf wie s.Trim() zur Null Reference Exception. Null-Reference-Laufzeitfehler treten auch häufig in Visual Studio selbst auf, weil auch dort die Entwickler nicht immer den Null-Fall abgefangen haben (Abb. 1).

schwichtenberg_c_sharp_8_1.tif_fmt1.jpgAbb. 1: Null-Reference-Fehler in Visual Studio 2019 nach dem Versuch, einen Menüpunkt anzuwählen: Da haben die Entwickler bei Microsoft nicht aufgepasst

Nullable-Kontexte

Das C#-Entwicklungsteam möchte nun in der achten Version der Programmiersprache C# den Softwareentwicklern Hilfsinstrumente bieten, um diese Null-Reference-Fehler zu vermeiden. Diese Instrumente sind optional, d. h. im Standard nicht aktiv. Es war in der Entwicklungsphase im Gespräch, diese Instrumente im Standard zu aktivieren. Das wurde aber verworfen, weil es zu viele Warnungen in bestehendem Programmcode gibt.

  • Das erste Instrument ist der Nullable Warning Context. In diesem Kontext warnt der Compiler vor dem Auftreten von Null-Reference-Laufzeitfehlern bei allen Zugriffen auf Objektreferenzen, bei denen möglich und nicht seitens des Entwicklers sichergestellt ist, dass sie nicht null enthalten. Der Compiler ist nur zufrieden, wenn man den Null-Fall behandelt.

  • Das zweite Instrument ist der Nullable Annotation Context. In diesem Kontext sind Referenztypen (string, eigene Klassen) im Standard nicht mehr nullable, d. h. nicht mehr fähig, den Nullwert anzunehmen). Wenn Nullwerte explizit gewünscht sind, ist das mit dem Fragezeichen bei der Typdeklaration anzuzeigen, z. B. string? und Klasse?. Es ist aber nicht erlaubt, hier Nullable<string> und Nullable<Klasse> statt des Fragezeichens zu verwenden wie bei den Nullable Value Types, die Microsoft in ...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang