Sollte unter normalen Umständen niemals etwas null
sein, überprüfen Sie nicht. Lassen Sie die Anwendung eine Ausnahme auslösen. Andernfalls, wenn Sie überprüfen zu tun und es ist null
, was werden Sie tun? Sie könnten die null
durch etwas anderes ersetzen, aber ist dieser Wert korrekt?
Aber der bessere Ansatz ist, den Zustand Ihrer Klassen mit eiserner Faust zu kontrollieren. Wenn List<string> Bars
nicht null sein soll, nicht lassen Sie es null sein. Lassen Sie nicht zu, dass ein Objekt sich in einen ungültigen Zustand versetzt, und erlauben Sie anderen Objekten nicht, es in einen ungültigen Zustand zu versetzen. Wenn es nicht sein kannnull
dann müssen Sie nicht überall überprüfen. null
Überprüfungen überall sind eine Plage und ein Zeichen, dass wir nicht wissen, wie der Zustand unseres Codes ist.
In seiner einfachsten Form:
class Foo {
public List<string> Bars { get; } = new List<string>();
public Foo() { }
}
könnten Sie tun auch
class Foo {
private readonly List<string> _bars = new List<string>();
public List<string> Bars { get { return _bars; } }
public Foo() { }
}
Jetzt _bars
auf eine neue Liste gesetzt wird, wenn Foo
erstellt wird und der Compiler wird verhindern, dass Sie immer _bars
ändern. Sie können nur den Inhalt ändern. Nun, solange Sie mit dieser Klasse arbeiten, müssen Sie sich immer darum kümmern, ob _bars
(oder durch die Erweiterung Bars
) null
ist.
Das gleiche gilt für Methoden, die Sammlungen oder andere Objekte zurückgeben. Wenn Sie nichts zurückgeben möchten, geben Sie nicht null
zurück. Geben Sie ein leeres Array oder ein "leeres" Objekt zurück, mit dem die empfangende Methode harmlos arbeiten kann.
Wenn 'Bars' jemals null ist, dann sollten Sie vor dem Zugriff darauf prüfen, ob es nicht null ist, da sonst eine Nullref-Ausnahme auftritt. Überprüfen, dass es nicht Null ist, ist jedoch Business-Logik .. – stuartd
Nein, der Rest der 'Foo' Klasse sollte sicherstellen, dass Invariante zu jeder Zeit hält. – Lee
'Bars' ist jedoch öffentlich, und eine andere Klasse könnte es auf null setzen. – stuartd