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.

    
___
8
Antworten

Gibt es ein Visualisierungstool, mit dem eine Java-Codebasis untersucht und Abhängigkeiten zwischen den Paketen gemeldet werden können?

Wir haben eine Java-Code-Basis, die für ein einzelnes monolithisches JAR (mehr als 5000 Klassen) zu groß geworden ist. Eine der Aufgaben, die wir untersuchen, ist, wie viel Aufwand es wäre, diese einzelne JAR in kleinere Komponenten mit kontroll...
29.09.2010, 20:10
2
Antworten

Listen Sie alle Ausnahmen auf, die von einer Methode ausgelöst werden könnten

___ tag123net ___ Das .NET-Framework ist ein Software-Framework, das hauptsächlich für das Microsoft Windows-Betriebssystem entwickelt wurde. Es enthält eine Implementierung der Basisklassenbibliothek, Common Language Runtime (allgemein als CLR bezei...
06.04.2010, 12:48
3
Antworten

Leere Methode in einer abstrakten Klasse

Ich habe gerade PMD installiert, um mein Java-Projekt zu analysieren. Wirklich schönes Werkzeug, sehr zu empfehlen. Wie auch immer, ich habe ein paar Fehler, die sagen:    "Eine leere Methode in einer abstrakten Klasse sollte stattdessen abst...
16.04.2009, 10:42
5
Antworten

Statischer-Code-Analysator: nicht verwaltetes C ++ Visual Studio 2008

Ich entwickle kommerzielle nicht verwaltete C ++ - Anwendungen in Visual Studio 2008 und möchte ein Analysewerkzeug für statische Codes hinzufügen. Irgendwelche Empfehlungen? Ich denke, es wäre wirklich schön, wenn das Tool in MSVC integri...
11.04.2009, 05:52
2
Antworten

Deaktivieren Sie Sonar-Duplikate für Entity-, DTO-Pakete

Gibt es eine Möglichkeit, bestimmte Metriken von ausgewählten Paketen in Sonar zu deaktivieren? Ich verwende Sonar, um mein Projekt zu analysieren, und in Entity- und DTO-Paketen habe ich einen Code, der gleich ist - die gleiche Feld-ID mit Anme...
18.06.2012, 08:22
3
Antworten

Richtiger Beweis für die Eigenschaft des folgenden C ++ - Codes?

Nehmen Sie das folgende C ++ 14 Code-Snippet: %Vor% Anweisung: Die Funktion f gibt das Maximum ihrer Argumente zurück. Nun ist die Aussage "offensichtlich" wahr, aber ich habe sie nicht streng genug in Bezug auf die ISO / IEC 1488...
08.01.2018, 13:45
4
Antworten

Impact-Analyse mit Eclipse für Java-Anwendung mit Framework-Code

Kann die Einflussanalyse in Eclipse durchgeführt werden? Wenn es einige Klassen und Methoden gibt, die geändert werden müssen, finden Sie die Auswirkungen dieser Änderung auf den Rest des Anwendungscodes (andere Klassen und Methoden). Das Kernpr...
01.12.2009, 04:03
2
Antworten

Was ist der Unterschied zwischen Datenflussanalyse und abstrakter Interpretation?

Was ist der Unterschied zwischen Datenflussanalyse und abstrakter Interpretation und werden sie für den gleichen Zweck verwendet? Was sind die Vor- und Nachteile dieser beiden zueinander?     
28.06.2013, 18:16
1
Antwort

clangs Scan-Build funktioniert nicht für einfache CPP-Dateien

Ich kann nicht% s c++-analyzer von clang bekommen, um an einer Spielzeug C ++ Datei zu arbeiten. %Vor% makefile ist nur %Vor% scan-build make output: %Vor% Wie funktioniert der C ++ - Analyzer? Clangs Version ist 2.9 unter Ubun...
14.06.2012, 16:13
3
Antworten

Wie erzeuge ich ein Programmabhängigkeitsdiagramm für ein C-Programm?

Ich möchte ein Programm Dependency Graph (PDG) aus C-Quellcode generieren. Ich fand Papiere, die erklären, wie es geht, aber alle verwendeten das kommerzielle CodeSurfer-Tool. Gibt es irgendwelche kostenlosen Tools, die das tun?     
26.10.2011, 15:04