2014-03-12 4 views
7

In unserer Codebasis haben wir eine Reihe von benutzerdefinierten Fehlerüberprüfungsfunktionen (wie die aufgelisteten here), um Argumente weniger ausführlich zu überprüfen. Zum Beispiel, ein Argument für null zu überprüfen, die ich benutze:Wie man R # anzeigt, dass eine Funktion eine Variable auf Null prüft

Throw.IfNull(theArgument, "theArgument"); 

Der einzige Nachteil dieses Ansatzes ist, dass R # die Warnung „möglich Nullreferenceexception“ auf dem künftigen Nutzung des Wertes gibt, weil es nicht klug genug, dies zu erkennen, als ein Null-Check (oder zumindest etwas, das fehlschlagen würde, wenn das Argument Null wäre). Gibt es eine Möglichkeit anzugeben, dass diese Methode überprüft, ob das Argument null ist? Wenn ich beispielsweise versuche, eine statische Erweiterung wie Select() für einen solchen Wert auszuführen, warnt R # mich vor einer möglichen Nullzuweisung an ein mit NotNull-Attribut markiertes Objekt, aber ich kann keine Dokumentation eines solchen Attributs finden sehe ich es in der Referenzquelle für Enumerable.Select().

Antwort

12

Was Sie fragen, kann definitiv gelöst werden, indem Sie ReSharper Annotations anwenden! Dies sind Attribute, die zusätzliche Hinweise für die Analyse von ReSharper bieten, so dass Sie ReSharper "Güte" zu Ihren eigenen Methoden und Klassen hinzufügen können. Ich habe kürzlich ein Webinar mit JetBrains mit dem Namen ReSharper Secrets aufgenommen, in dem ich über Anmerkungen spreche und diese demonstriere.

Was Ihre Frage betrifft, gibt es 3 Annotationsattribute, die Sie anwenden können, um Ihre Probleme zu lösen (und weitere coole Funktionen hinzuzufügen).

die Definition für IfNull Gesetzt ist so etwas wie:

public static class Throw 
{ 
    public static void IfNull<T>(T parameter, string parameterName) where T : class 
    { 
     if (parameter == null) 
      throw ArgumentNullException(string.Format("Parameter {0} is null", parameterName)); 
    } 
} 

Sie dekorieren mit 3 ReSharper Attribute, ContractAnnotation, NotNull und InvokerParameterName wie folgt aus:

[ContractAnnotation("parameter: null => halt")] 
public static void IfNull<T>([NotNull] T parameter, 
          [InvokerParameterName] string parameterName) 
    where T : class 
{ 
    ... 
} 

Hier ist, was diese Attribute tun :

Die erste, [ContractAnnotation], sagt ReSharper, dass wenn parameter ist heuristisch null, dann stoppt diese Methode die Programmausführung, d. H. Gibt Ausnahme (zur Laufzeit) aus. Dies verhindert die Warnung "mögliche NullReferenceException". Die für die Definition von Vertragskommentaren verwendete Sprache wird erklärt here.

Die zweite ist [NotNull], sagt ReSharper, dass parameter nicht heuristisch Null sein muss. Dies ergibt die "Mögliche Nullzuweisung für die Entity, die mit der [NotNull] -Attribut" - Warnung markiert ist.

Die dritte, [InvokerParameterName] sagt ReSharper dass das parameterName Argument den Namen einer der Parameter von dem anrufenden ist (Aufruf) Verfahren, so wird es Code-Vervollständigung bereitzustellen, die alle Rufmethode Parameter auflistet. Dies gibt eine Warnung in ReSharper, wenn der Name kein Parameter ist, z. B. ein lokaler Variablenname.

Hier ist ein kurzes Video dieser Attribute in Aktion (auf einem anderen Satz von APIs angewandt, aber die Idee ist genau das gleiche): http://screencast.com/t/NhGVaUr7GO3b

Verwandte Themen