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.

    
___
3
Antworten

Gibt es Code-Metriken, die das variable Scoping abdecken?

Bei dem Versuch, einen Überblick darüber zu bekommen, wie schwierig einige Legacy-C ++ - und C # -Code zu pflegen sind und das Risiko, Bugs einzuführen, wurde vorgeschlagen, zu messen, wie weit oder eng Variablen im Bereich liegen. Der Code verw...
15.01.2013, 10:19
1
Antwort

Welche Form der Alias-Analyse verwendet Visual C ++?

Ich versuche herauszufinden, welche Form der Alias-Analyse in Visual C ++ verwendet wird. Es ist auch bekannt als Pointer-Analyse, Mod-Ref-Analyse, Punkt-zu-Analyse oder Nebeneffekt-Analyse, und ist ziemlich nah an Flucht-Analyse oder Form-Ana...
31.08.2009, 16:26
2
Antworten

ClangFormat-Stil für ReactiveCocoa

Ich verwende ClangFormat . Ich möchte den Stil meines ReactiveCookoo-Codes von diesem aktualisieren %Vor% zu diesem %Vor% Welche ClangFormat-Attribute sollte ich betrachten, um dies zu erreichen? Meine aktuelle .clang-format -...
07.07.2016, 12:27
1
Antwort

AST für mehrere Quelldateien mit Clang

Ich mache interprozedurale Datenflussanalyse mit Clang. Momentan benutze ich libtooling, um Quelldateien zu analysieren und AST-Besucher anzurufen. Die Frage ist, wie erstelle ich einen einzelnen AST für mehrere .c-Dateien? Ich habe versucht,...
15.02.2013, 11:50
5
Antworten

C # Zusammenfassung Dispose-Methode

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: Än...
09.11.2009, 20:40