Wie kann ich zeigen, dass eine Methode in C # niemals null (Design by contract) zurückgibt?

8

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?

    
StackUnderflow 27.01.2009, 18:18
quelle

9 Antworten

10

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.

    
Oliver Hallam 27.01.2009, 18:25
quelle
6

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.

    
Jason Jackson 27.01.2009 18:21
quelle
2

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.

    
Brawndo 27.01.2009 18:25
quelle
2

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.

    
Robert P 27.01.2009 19:02
quelle
1

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

    
Joel Coehoorn 27.01.2009 18:49
quelle
0

Wenn Ihre Benutzer Ihren Quellcode mit einer Standard-Vertrags-API wie: Ссылка verwenden können Dinge klar.

Andernfalls ist Ihre beste Wette durch Dokumentation.

    
JoshBerke 27.01.2009 18:22
quelle
0

Entweder dokumentieren Sie es gut (vielleicht mit .NET-Standard-Dokumentationssystem) oder Sie müssen eine Contract-API verwenden. Hier sind einige: Ссылка Ссылка

    
Stefano Driussi 27.01.2009 18:25
quelle
0

Sie könnten eine Debug.Assert () -Methode einschließen. Obwohl dies die Bedingung sicherlich nicht durchsetzen wird, sollte es (zusammen mit der Dokumentation) klarstellen, dass ein Nullwert nicht akzeptabel ist.

    
Otis 27.01.2009 18:25
quelle
0

Dokumentieren Sie es und geben Sie den Quellcode an.

    
Tundey 27.01.2009 18:33
quelle

Tags und Links