Ich habe eine Methode, die niemals ein Null-Objekt zurückgibt. Ich möchte es klarstellen, damit Benutzer meiner API Code nicht wie folgt schreiben müssen:
%Vor%Wie kann ich diese Absicht zeigen?
Unerwarteterweise ist in C # kein Weg eingebaut
Sie können dies dokumentieren, aber dies wird nicht automatisch überprüft.
Wenn Sie reSharper verwenden, kann es eingerichtet werden, dies ordnungsgemäß zu überprüfen, wenn die Methode mit einem [NotNull] -Attribut markiert ist.
Andernfalls können Sie die Microsoft-Verträge -Bibliothek verwenden und Ihrer Methode etwas Ähnliches wie folgt hinzufügen , aber das ist ziemlich viel zusätzliches Wort für solch eine einfache Anmerkung.
%Vor%Spec # löste dieses Problem, indem es a! nach dem Typ, um es als Nicht-Null-Typ zu markieren, zB
%Vor%aber Spec # kann nur für .NET2 verwendet werden und wurde von der Code Contracts-Bibliothek übernommen.
Wenn Sie nicht einen Typ verwenden, der auf System.ValueType basiert, haben Sie wahrscheinlich kein Glück. Es ist wahrscheinlich am besten, dies im XML / Metadaten-Kommentar für die Funktion eindeutig zu dokumentieren.
Ich weiß nicht, dass es eine Best Practice dafür gibt, dies von einer API aus zu tun, da ich immer noch defensiv programmieren und als Verbraucher auf Null prüfen würde. Ich denke, dass dies immer noch die beste Vorgehensweise in diesem Fall ist, da ich dazu tendiere, anderen Code nicht zu vertrauen, immer das Richtige zu tun.
Der einzige vom Typ geprüfte Weg, um sicherzustellen, dass ein C # -Objekt niemals null zurückgibt, ist die Verwendung einer Struktur. Structs können Member enthalten, die Nullwerte enthalten, aber niemals selbst null sein können.
Alle anderen C # -Objekte können null sein.
Beispielcode:
%Vor%Das obige Beispiel wird nicht kompiliert. Wenn die Verwendung einer Struktur akzeptabel ist (sie wird zu einem Werttyp, wird auf dem Stapel weitergegeben, kann nicht unterklassifiziert werden), dann könnte dies für Sie funktionieren.
Ich mag es anders herum zu denken: Wenn meine Funktion einen Nullwert zurückgeben könnte, stelle ich besser sicher, dass der Benutzer der Funktion davon weiß.
Tags und Links c# design-by-contract