ReSharper: So entfernen Sie die Warnung "Possible 'System.NullReferenceException'"

9

Hier ist ein Stück Code:

%Vor%

Hier ist alles in Ordnung. Aber wenn ich "wenn" Zeile mit dem folgenden ersetzen:

%Vor%

wo die Funktionsimplementierung folgt:

%Vor%

Dann erzeugt der Nachschärfer eine Warnung: Mögliche 'System.NullReferenceException', die auf die erste Verwendung des 'Benutzer' -Objekts zeigt.

Q1. Warum erzeugt es solche Ausnahmen? Soweit ich sehe, wenn 'user == null', dann wird eine Ausnahme generiert und die Ausführung wird niemals den Verwendungspunkt erreichen.

Q2. Wie kann ich diese Warnung entfernen? Bitte beachten Sie:  1. Ich möchte diese Warnung nicht mit Kommentaren unterdrücken (ich werde viele ähnliche Teile haben und meinen Quellcode nicht in 'kommentierte garbase' transformieren wollen);  2. Ich möchte die Nachschärfeinstellungen nicht ändern, um dieses Problem von einer Warnung zu einem "Vorschlag" von "Hinweis" zu ändern.

Danke.

Irgendwelche Gedanken sind willkommen!

P.S. Ich benutze Resharper 5.1, MVSV 2008, C #

    
Budda 08.12.2010, 23:38
quelle

5 Antworten

6

Q1: Weil Resharper keine Pfadanalyse durchführt. Es sieht nur eine mögliche null -Referenz und markiert diese.

Q2: Sie können nicht, ohne das zu tun, was Sie bereits zur Verfügung gestellt haben.

    
Femaref 08.12.2010, 23:45
quelle
10

Resharper betrachtet nur die aktuelle Methode für seine Analyse und analysiert nicht rekursiv andere Methoden, die Sie aufrufen.

Sie können jedoch Resharper ein wenig anweisen und ihm Metainformationen über bestimmte Methoden geben. Es weiß zum Beispiel über "Assert.IsNotNull (a)" und wird diese Information für die Analyse berücksichtigen. Es ist möglich, eine externe Anmerkungsdatei für Resharper zu erstellen und ihr zusätzliche Informationen über eine bestimmte Bibliothek zu geben, um ihre Analyse zu verbessern. Vielleicht bietet dies eine Möglichkeit, Ihr Problem zu lösen.

Weitere Informationen finden Sie hier .

Ein Beispiel, das zeigt, wie es für die Bibliothek Microsoft.Contracts verwendet wird, ist hier .

    
rvdginste 08.12.2010 23:57
quelle
6

Eine neue Antwort im alten Post ...

Hier ein kleiner Auszug aus meinem Code zur Verwendung von CodeContract über ContractAnnotation mit Resharper:

%Vor%

Es ist sehr einfach ... wenn du den Brotkrumen im Holz findest. Sie können auch andere Fälle überprüfen.

Schönen Tag noch

    
user3464936 26.03.2014 15:28
quelle
3

Sie wissen (oder erwarten), dass dieser Code eine Ausnahme auslöst, wenn es einen Nullverweis gibt:

%Vor%

Da es jedoch keinen Vertrag gibt, der dies spezifiziert, muss ReSharper annehmen, dass dies nur ein normaler Methodenaufruf ist, der in jedem Fall zurückkehren kann, ohne irgendeine Ausnahme auszulösen.

Wenn diese Methode den ReSharper-Vertrag implementiert, oder als einfache Problemumgehung (die sich nur auf den Debug-Modus auswirkt, also keine Leistungseinbuße für den Freigabemodus), direkt nach dem Aufruf von FailIfTrue :

%Vor%

Das wird die Warnung los, und als zusätzlichen Bonus machen Sie eine Laufzeitprüfung im Debug-Modus, um sicherzustellen, dass die Bedingung, die Sie nach dem Aufruf von FailIfTrue angenommen haben, tatsächlich erfüllt ist.

    
Lucero 09.12.2010 00:34
quelle
0

Dies wird durch den Resharper-Motor verursacht. Diese "mögliche NullReferenceException" tritt auf, weil jemand (wahrscheinlich bei Resharper) irgendwo eine Annotation für die Methode deklariert / konfiguriert hat.

So funktioniert es: ReSharper NullReferenceException Analyse und seine Verträge

Leider sind diese nützlichen Anmerkungen manchmal falsch.

Wenn Sie einen Fehler feststellen, sollten Sie ihn an JetBrains melden und er wird die Anmerkungen bei der nächsten Version aktualisieren. Sie sind daran gewöhnt.

Unterdessen können Sie versuchen, es selbst zu beheben. Lesen Sie den Artikel für mehr:)

    
Simon Mourier 08.12.2010 23:53
quelle