Zum Beispiel möchten Sie normalerweise nicht, dass Parameter in einem Konstruktor null sind, also ist es sehr normal, etwas wie
zu sehen %Vor%Es stört den Code ein wenig.
Gibt es eine Möglichkeit, ein Argument einer Liste von Argumenten besser als dieses zu überprüfen?
Etwas wie "Überprüfen Sie alle Argumente und werfen Sie eine ArgumentNullException, wenn eine von ihnen null ist und Sie die Argumente, die Null waren.
Übrigens geht es in Bezug auf doppelte Frageansprüche nicht darum, Argumente mit Attributen oder etwas, das eingebaut ist, zu markieren, sondern was manche Guard-Klauseln nennen, um zu garantieren, dass ein Objekt initialisierte Abhängigkeiten erhält.
Verwendung:
%Vor% Das DebuggerStepThroughAttribute
ist ziemlich praktisch, so dass ich im Falle einer Exception während des Debuggens (oder wenn ich den Debugger anhefte, nachdem die Ausnahme aufgetreten ist) nicht in der ArgumentNotNull
-Methode, sondern bei der aufrufenden Methode wo enden werde Die Nullreferenz actually
ist aufgetreten.
Ich verwende ReSharper Contract Annotations .
ContractAnnotationAttribute
stellt sicher, dass ich nie falsch schreibe
das Argument ( "foo"
) und benennt es auch automatisch um, wenn ich es umbenenne
das Symbol% co_de%. foo
hilft ReSharper bei der Codeanalyse. Also, wenn ich NotNullAttribute
mache, bekomme ich eine Warnung von ReSharper, dass dies zu einer Ausnahme führt. Wenn Sie zu viele Parameter in Ihren Konstruktoren haben, sollten Sie sie besser überarbeiten, aber das ist eine andere Geschichte.
Um den Überprüfungscode zu reduzieren, schreiben viele Leute Guard-Utility-Klassen wie folgt:
%Vor%(Sie können weitere Validierungsmethoden hinzufügen, die für diese Guard-Klasse möglicherweise erforderlich sind.)
Es braucht also nur eine Zeile Code, um einen Parameter zu validieren:
%Vor%Null-Referenzen sind eine Art von Problemen, vor denen Sie sich schützen müssen. Aber sie sind nicht die einzigen. Das Problem ist breiter als das, und es läuft darauf hinaus: Methode akzeptiert Instanzen eines bestimmten Typs, aber es kann nicht alle Instanzen behandeln.
Mit anderen Worten: Der Bereich der Methode ist größer als die Menge der Werte, die er behandelt. Guard-Klauseln werden dann verwendet, um zu bestätigen, dass der tatsächliche Parameter nicht in diese "Grauzone" der Domäne der Methode fällt, die nicht behandelt werden kann.
Nun haben wir Null-Referenzen als einen Wert, der normalerweise außerhalb der akzeptablen Menge von Werten liegt. Auf der anderen Seite passiert es oft, dass einige Nicht-Null-Elemente der Menge auch nicht akzeptabel sind (z. B. leere Zeichenfolge).
In diesem Fall kann sich herausstellen, dass die Methodensignatur zu breit ist, was auf ein Designproblem hinweist. Dies kann zu einem Redesign führen, z. Definieren eines Untertyps, typischerweise einer abgeleiteten Schnittstelle, der die Domäne der Methode einschränkt und einige der Schutzklauseln verschwinden lässt. Sie finden ein Beispiel in diesem Artikel: Warum brauchen wir Guard Clauses?
Es gibt ein nugget-Paket namens Swissknife. Installieren Sie Swissknife von der nugget Galerie. Es bietet Ihnen viele Optionen beginnend mit der Nullprüfung auf Argumente
Argument.IsNotNullOrEmpty(args,"args")
unter Swissknife.Diagnostics.Contracts
namespace zusammen mit der Option idoim und viele mehr. Sie können Option<Class_Name> _someVar
setzen und dann prüfen, ob _someVar.IsSome or _SomeVar.IsNone
. Dies hilft auch bei nullbaren Klassen. Hoffe, das hilft.
Tags und Links c# arguments constructor