static-analysis

___ qstnhdr ___ C # Zusammenfassung Dispose-Methode ___ qstntxt ___

Ich habe eine abstrakte Klasse, die IDisposable wie folgt implementiert:

%Vor%

In Visual Studio 2008 Team System habe ich Code Analysis für mein Projekt ausgeführt und eine der folgenden Warnungen war die folgende:

  

Microsoft.Design: Ändern Sie "ConnectionAccessor.Dispose ()" so, dass es Dispose (true) aufruft, und ruft dann GC.SuppressFinalize für die aktuelle Objektinstanz ("this" oder "Me" in Visual Basic) auf und kehrt dann zurück .

Ist es nur albern, mir zu sagen, dass ich den Körper einer abstrakten Methode modifizieren soll, oder sollte ich etwas in einer abgeleiteten Instanz von %code% machen?

    
___ answer1704247 ___

Das einzige Problem, das ich mit den bisher gelieferten Antworten haben könnte, ist, dass alle davon ausgehen, dass Sie brauchen, um einen Finalizer zu haben, was nicht unbedingt der Fall ist. Mit der Finalisierung ist ein ziemlich signifikanter Leistungsaufwand verbunden, den ich nicht allen abgeleiteten Klassen auferlegen möchte, wenn dies nicht notwendig ist.

Siehe diesen Blogbeitrag von Joe Duffy, der erklärt, wann Sie einen Finalizer benötigen oder nicht, und wie Sie das Dispose-Pattern in jedem Fall richtig implementieren können.
Wenn Sie Joes Blogpost zusammenfassen, sollten Sie keinen Finalizer implementieren, es sei denn, Sie tun etwas, das mit nicht verwaltetem Speicher zu tun hat. Als allgemeine Faustregel gilt, dass wenn Ihre Klasse nur Verweise auf verwaltete Typen enthält, die IDisposable selbst implementieren, Sie den Finalizer nicht benötigen (aber IDisposable implementieren und diese Ressourcen entfernen sollten). Wenn Sie nicht verwaltete Ressourcen direkt aus Ihrem Code (PInvoke?) Zuweisen und diese Ressourcen freigegeben werden müssen, benötigen Sie eine. Eine abgeleitete Klasse kann immer einen Finalizer hinzufügen, wenn sie dies wirklich benötigt, aber wenn alle abgeleiteten Klassen durch Einfügen in die Basisklasse einen Finalizer erhalten, werden alle abgeleiteten Klassen vom Leistungstreffer der finalisierbaren Objekte beeinflusst, wenn dieser Overhead nicht vorhanden ist notwendig.

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123abstractclass ___ Abstrakte Klassen sind Klassen, die nicht instanziiert werden können. Sie existieren, um verschiedenen konkreten Klassen gemeinsame Funktionalität und Schnittstellenspezifikationen zur Verfügung zu stellen. ___ answer1703769 ___

Obwohl es ein wenig wie Nit-Picking scheint, ist der Ratschlag gültig. Sie geben bereits an, dass Sie erwarten, dass Untertypen von ConnectionAccessor etwas haben, das sie entsorgen müssen. Daher scheint es besser zu sein, sicherzustellen, dass die richtige Bereinigung (in Bezug auf den GC.SuppressFinalize-Aufruf) von der Basisklasse durchgeführt wird, anstatt sich auf jeden Untertyp zu verlassen.

Ich verwende das in Bruce Wagners Buch Effective C # genannte Entsorgungsmuster, das im Grunde Folgendes ist:

%Vor%     
___ answer1703760 ___

Die Warnung ist jedoch interessant. Eric Lippert, einer der C # -Designer, bloggte darüber, warum Fehlermeldungen "Diagnostisch, aber nicht präskriptiv sein sollten: Beschreibe das Problem, nicht die Lösung". Lesen Sie hier.

    
___ answer1703691 ___

Die Warnung weist Sie im Wesentlichen an, das Dispose-Muster zu implementieren in deiner Klasse.

Der resultierende Code sollte wie folgt aussehen:

%Vor%     
___ tag123dispose ___ Führt anwendungsdefinierte Tasks zum Freigeben, Freigeben oder Zurücksetzen nicht verwalteter Ressourcen aus ___ tag123statistische Analyse ___ "Statische Analyse" bezieht sich auf die Software-Tools (oder ihre Verwendung) zur Analyse von Anwendungscode für beliebige Eigenschaften wie Fehler (nicht initialisierte Variablen, mögliche SQL-Injection-Attacken, ist dieser Code tot, kann ein Argument null sein, ...) oder Struktur (was ist das Aufrufdiagramm für diesen Code? Gibt es einen doppelten Code? Welche Informationen werden zwischen den Komponenten ausgetauscht?). ___ answer1703742 ___

Sie sollten dem herkömmlichen Muster für die Implementierung von %code% folgen. Das Erstellen von %code% virtual wird als schlechte Methode betrachtet, da das herkömmliche Muster die Wiederverwendung von Code in "managed cleanup" (API-Client ruft %code% direkt oder via %code% ) und "nicht verwaltete Bereinigung" (GC-Aufruffinalisierer) hervorhebt. Zur Erinnerung, das Muster ist das:

%Vor%

Der Schlüssel hier ist, dass es keine Verdoppelung zwischen dem Finalizer und %code% für die nicht verwaltete Bereinigung gibt und dass jede abgeleitete Klasse sowohl die verwaltete als auch die nicht verwaltete Bereinigung erweitern kann.

Für Ihren Fall sollten Sie Folgendes tun:

%Vor%

und lass alles andere so wie es ist. Auch das ist von zweifelhaftem Wert, da Sie Ihre abgeleiteten Klassen dazu zwingen, jetzt %code% zu implementieren - und woher wissen Sie, dass sie alle brauchen? Wenn Ihre Basisklasse nichts zu erledigen hat, aber die meisten abgeleiteten Klassen wahrscheinlich (mit einigen Ausnahmen, vielleicht), dann geben Sie einfach eine leere Implementierung an. Es ist was %code% (selbst abstrakt) tut, also gibt es Präzedenzfälle.

    
___
1
Antwort

Überprüfen Sie, ob Java-Klassen toString () implementieren.

Als Teil der regulären statischen Analyse meines Programms möchte ich überprüfen, ob Klassen wahrscheinlich vernünftige toString() -Methoden haben. Wahrscheinlich nicht, dass jede Klasse sie implementiert, aber vielleicht verwendet keine inst...
08.03.2013, 23:03
6
Antworten

So finden Sie nicht verwendete Attribute / Methoden in Visual C ++ 2008

Gibt es eine Möglichkeit, nicht verwendete Attribute / Methoden in Visual C ++ 2008 Professional zu identifizieren? Wenn dies nicht standardmäßig möglich ist, werden auch Empfehlungen von Drittanbieter-Tools sehr geschätzt. Danke, Danke Flori...
29.09.2008, 14:09
3
Antworten

Welche Praktiken der sicheren Softwareentwicklung setzen Sie ein?

Ich arbeite an einem Projekt, das als SDL-Projekt (Security Development Lifecycle) bei Microsoft bekannt ist ( Ссылка ) - kurz gesagt, es ist ein Satz von Praktiken, die von Produktgruppen verwendet werden müssen, bevor sie Produkte liefern, um...
31.03.2010, 16:39
6
Antworten

Entdecken Sie NullPointerException Fehler mit FindBugs

Wenn ich FindBugs für diesen Code ausführe, meldet er KEINE Probleme. %Vor% Während hier findet es Problem wie erwartet: %Vor% Warum schlägt es im ersten Fall fehl?     
07.05.2010, 21:28
5
Antworten

Ist die Löschung von Objekten / die Zuordnung von Arrays in VB6 / VBA wirklich notwendig? (Pro / Contra?)

Eine Menge von dem, was ich über VB gelernt habe, habe ich aus der Verwendung der statischen Code-Analyse (insbesondere Aivostos Project Analyzer) gelernt. Und eines der Dinge, die es überprüft, ist, ob Sie alle Objekte und Arrays gelöscht haben...
06.10.2009, 13:58
5
Antworten

Mit welchen statischen Analysatoren können Sie Java-Code ausführen und warum?

Ich habe mit verschiedenen statischen Analysatoren für Java experimentiert, insbesondere mit Findbugs und PMD. Ich suche nach Beispielen für andere statische Analysatoren, die es wert sind, mit Java-Code ausgeführt zu werden.     
13.05.2010, 14:51
6
Antworten

Gibt es ein statisches Analysewerkzeug für Python, Ruby, Sql, Cobol, Perl und PL / SQL? [geschlossen]

Ich suche nach einem statischen Analysetool für Python, Ruby, Sql, Cobol, Perl, PL / SQL, SQL ähnlich wie Bugs zu finden und Stil zu überprüfen. Ich suche die Berechnung der Zeilenanzahl, die Identifizierung von Fehlern während der Entwicklung u...
05.06.2009, 14:17
4
Antworten

Werkzeug zum Analysieren und Vergleichen der Logik ähnlicher Funktionen?

Ich habe kürzlich ein Projekt mit einer großen Codebasis ausgewählt, das viele Duplikate enthält. Das Problem besteht darin, dass die duplizierte Funktionalität nicht von denselben Personen geschrieben oder zwischen ihnen kopiert wurde. Gibt...
14.02.2012, 16:21
6
Antworten

Wie kann ich die Signal / Slot-Verbindungen während des Kompilierens überprüfen?

Die Überprüfung der Qt-Signal-Slot-Verbindung zur Laufzeit ist eine Sorge für mich. Ich sollte eine statische Überprüfung der connect-Anweisungen ausführen können. Existiert ein solches Tool?     
03.01.2012, 09:39
3
Antworten

Gibt es ein separates FindBugs Plug-in für Android Studio?

Nach diesem , FindBugs unterstützt mehrere IDEs als Plug-In, einschließlich IntelliJ-Idea, auf dem Droidio ( Android Studio ) basiert. Dies bedeutet also, dass das IntelliJ-Idea Plug-in in Droidio installiert werden kann, oder gibt es ei...
10.04.2014, 18:31