2014-01-06 12 views
5

IMHO, da öffentliche Methoden mit Parametern von jedem anderen Programmierer aufgerufen werden können, ist es verantwortlich, Parameterwerte zu überprüfen und sinnvolle ArgumentException zu werfen, sollte einer von ihnen ungültig sein. Warum sollte ich Code Contracts in öffentlichen Methoden verwenden?

Dass gesagt wird, warum würde ich es vorziehen, diese:

public void Toto(string parameter) 
{ 
    Contract.Requires(parameter != null); 
    //... 
} 

... über das?

public void Toto(string parameter) 
{ 
    if (parameter == null) 
     throw new ArgumentNullException(nameof(parameter)); 
    //... 
} 

Im ersten Szenario muss Runtime-Vertrag Prüfung aktiviert sein, damit die Ausnahme ausgelöst werden. Wie wir wissen, wird diese Option wahrscheinlich für die Erstellung von Releases deaktiviert, was bedeutet, dass die Parameterüberprüfung nicht stattfindet. Für eine öffentliche Methode, die von jedem verwendet werden soll, den Sie als Teil eines freigegebenen Produkts kennen oder nicht kennen, scheint dies eine schlechte Idee zu sein.

Und selbst wenn die Laufzeitprüfung für Release-Builds aktiviert ist, wird die Ausnahme, die zurückgeworfen wird, nicht die sein, die ein typischer .NET-Entwickler erwarten würde (ArgumentNullException in diesem Fall).

Also was fehlt mir? Warum sollte ich Code Contracts über das "traditionelle" if-throw-Muster setzen?

+0

möglich Duplikat [Werfen einer Ausnahme vs Contract.Requires ?] (Http://stackoverflow.com/questions/14991647/throwing-an-exception-vs-contract-requirest) –

Antwort

5

Sie würden Verträge verwenden, da Benutzer mit Ihrem Code den statischen Analysator verwenden können, um Fehler in ihrem Code zu finden. Zusätzlich sollten Sie sicherstellen, dass Sie die Contract.Ensures-Methoden implementiert haben, damit andere Programmierer wissen, was Ihre Funktion garantiert.

Sie würden wahrscheinlich das alternative Format für Ihren Freischaltcode verwenden.

public void Toto(string parameter) 
{ 
    Contract.Requires<ArgumentNullException>(parameter != null); 
    //... 
} 

Da diese Version tatsächlich die Ausnahme auslösen würde, wenn der Parameter null wäre.

+2

Das wäre jedoch erfordert Laufzeit überprüft für Release-Builds aktiviert sein, oder? Gibt es da keine Nachteile? – Crono

+0

Ja, Sie müssen die Laufzeitprüfung für Ihre DLL durchführen (aber Sie müssen nur die Option Release benötigt wählen). Im Vergleich zum if ... throw-Ansatz wird dies keinen großen Nachteil darstellen. Und Sie haben den Vorteil, dass Sie Ihre Parameter direkt im XML-Dokument dokumentieren können. –

+0

Okay, das hört sich gut an! :) Außerdem verstehe ich, dass die Methode Requires <> mit Ausnahmen für die Programmierung geschrieben wurde, wie ArgumentException, InvalidOperationException oder NotSupportedException. Mit anderen Worten, Dinge, die einem Softwareentwickler etwas bedeuten. Hab ich recht? – Crono

Verwandte Themen